diff --git a/cmd/starlark/starlark.go b/cmd/starlark/starlark.go index af4f71f6..31555f1e 100644 --- a/cmd/starlark/starlark.go +++ b/cmd/starlark/starlark.go @@ -35,7 +35,7 @@ func init() { flag.BoolVar(&compile.Disassemble, "disassemble", compile.Disassemble, "show disassembly during compilation of each function") // non-standard dialect flags - flag.BoolVar(&resolve.AllowFloat, "float", resolve.AllowFloat, "allow floating-point numbers") + flag.BoolVar(&resolve.AllowFloat, "float", resolve.AllowFloat, "obsolete; no effect") flag.BoolVar(&resolve.AllowSet, "set", resolve.AllowSet, "allow set data type") flag.BoolVar(&resolve.AllowLambda, "lambda", resolve.AllowLambda, "allow lambda expressions") flag.BoolVar(&resolve.AllowNestedDef, "nesteddef", resolve.AllowNestedDef, "allow nested def statements") diff --git a/go.mod b/go.mod index 87e6d96b..0939059f 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,37 @@ module go.starlark.net go 1.13 require ( + github.com/NebulousLabs/go-upnp v0.0.0-20181203152547-b32978b8ccbf // indirect + github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect + github.com/btcsuite/btcwallet v0.11.0 // indirect + github.com/btcsuite/fastsha256 v0.0.0-20160815193821-637e65642941 // indirect + github.com/btcsuite/golangcrypto v0.0.0-20150304025918-53f62d9b43e8 // indirect github.com/chzyer/logex v1.1.10 // indirect github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 // indirect - golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae // indirect + github.com/go-errors/errors v1.1.1 // indirect + github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c // indirect + github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect + github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639 // indirect + github.com/jackpal/gateway v1.0.6 // indirect + github.com/kkdai/bstream v1.0.0 // indirect + github.com/lightninglabs/gozmq v0.0.0-20191113021534-d20a764486bf // indirect + github.com/lightninglabs/neutrino v0.11.0 // indirect + github.com/lightningnetwork/lnd v0.0.2 // indirect + github.com/ltcsuite/ltcd v0.20.1-beta // indirect + github.com/miekg/dns v1.1.35 // indirect + github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d // indirect + github.com/roasbeef/btcd v0.0.0-20180418012700-a03db407e40d // indirect + github.com/roasbeef/btcrpcclient v0.0.0-20170622074026-d0f4db8b4dad // indirect + github.com/roasbeef/btcutil v0.0.0-20180406014609-dfb640c57141 // indirect + github.com/tv42/zbase32 v0.0.0-20190604154422-aacc64a8f915 // indirect + gitlab.com/NebulousLabs/go-upnp v0.0.0-20181011194642-3a71999ed0d3 // indirect + golang.org/x/net/http2/h2demo v0.0.0-20201031054903-ff519b6c9102 // indirect + golang.org/x/tools/gopls v0.5.2 // indirect + golang.org/x/vgo v0.0.0-20180912184537-9d567625acf4 // indirect + google.golang.org/grpc v1.33.1 // indirect + google.golang.org/grpc/examples v0.0.0-20201030225255-4e179b8d3ec4 // indirect + gopkg.in/errgo.v1 v1.0.1 // indirect + gopkg.in/macaroon-bakery.v2 v2.2.0 // indirect + gopl.io v0.0.0-20200323155855-65c318dde95e // indirect ) diff --git a/go.sum b/go.sum index a969512d..7a78d256 100644 --- a/go.sum +++ b/go.sum @@ -1,8 +1,693 @@ +cloud.google.com/go v0.26.0 h1:e0WKqKTd5BnrG8aKH3J3h+QvEIQtSUcf2n5UZ5ZgLtQ= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.63.0 h1:A+DfAZQ/eWca7gvu42CS6FNSDX4R8cghF+XfWLn4R6g= +cloud.google.com/go v0.63.0/go.mod h1:GmezbQc7T2snqkEXWfZ0sy0VfkB/ivI2DdtJL2DEmlg= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0 h1:STgFzyU5/8miMl0//zKh2aQeTyeaUH3WN9bSUiJ09bA= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +git.schwanenlied.me/yawning/bsaes.git v0.0.0-20190320102049-26d1add596b6 h1:zOrl5/RvK48MxMrif6Z+/OpuYyRnvB+ZTrQWEV9VYb0= +git.schwanenlied.me/yawning/bsaes.git v0.0.0-20190320102049-26d1add596b6/go.mod h1:BWqTsj8PgcPriQJGl7el20J/7TuT1d/hSyFDXMEpoEo= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/NebulousLabs/go-upnp v0.0.0-20181203152547-b32978b8ccbf h1:1UP+tqdgLAKwt6NpefYq/SdyFaelU8MXOThESt6Od1U= +github.com/NebulousLabs/go-upnp v0.0.0-20181203152547-b32978b8ccbf/go.mod h1:GbuBk21JqF+driLX3XtJYNZjGa45YDoa9IqCTzNSfEc= +github.com/Yawning/aez v0.0.0-20180408160647-ec7426b44926 h1:oBNaMAcYxOjYhHIXs5U3Dz1bODLJTpP7mEI5yzhyu1k= +github.com/Yawning/aez v0.0.0-20180408160647-ec7426b44926/go.mod h1:9pIqrY6SXNL8vjRQE5Hd/OL5GyK/9MrGUWs87z/eFfk= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY= +github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA= +github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/bazelbuild/starlark v0.0.0-20201028205255-5e0e914c7a15 h1:2G8ltUPAXrgk3sVHLJFeyyubu72SucGLt84TzyQWT/0= +github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= +github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= +github.com/btcsuite/btcd v0.0.0-20190629003639-c26ffa870fd8/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.0.0-20190824003749-130ea5bddde3/go.mod h1:3J08xEfcugPacsc34/LKRU2yO7YmuT8yt28J8k2+rrI= +github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= +github.com/btcsuite/btcd v0.21.0-beta h1:At9hIZdJW0s9E/fAz28nrz6AmcNlSVucCH796ZteX1M= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/btcwallet v0.11.0 h1:XhwqdhEchy5a0q6R+y3F82roD2hYycPCHovgNyJS08w= +github.com/btcsuite/btcwallet v0.11.0/go.mod h1:qtPAohN1ioo0pvJt/j7bZM8ANBWlYWVCVFL0kkijs7s= +github.com/btcsuite/btcwallet/wallet/txauthor v1.0.0 h1:KGHMW5sd7yDdDMkCZ/JpP0KltolFsQcB973brBnfj4c= +github.com/btcsuite/btcwallet/wallet/txauthor v1.0.0/go.mod h1:VufDts7bd/zs3GV13f/lXc/0lXrPnvxD/NvmpG/FEKU= +github.com/btcsuite/btcwallet/wallet/txrules v1.0.0 h1:2VsfS0sBedcM5KmDzRMT3+b6xobqWveZGvjb+jFez5w= +github.com/btcsuite/btcwallet/wallet/txrules v1.0.0/go.mod h1:UwQE78yCerZ313EXZwEiu3jNAtfXj2n2+c8RWiE/WNA= +github.com/btcsuite/btcwallet/wallet/txsizes v1.0.0 h1:6DxkcoMnCPY4E9cUDPB5tbuuf40SmmMkSQkoE8vCT+s= +github.com/btcsuite/btcwallet/wallet/txsizes v1.0.0/go.mod h1:pauEU8UuMFiThe5PB3EO+gO5kx87Me5NvdQDsTuq6cs= +github.com/btcsuite/btcwallet/walletdb v1.0.0 h1:mheT7vCWK5EP6rZzhxsQ7ms9+yX4VE8bwiJctECBeNw= +github.com/btcsuite/btcwallet/walletdb v1.0.0/go.mod h1:bZTy9RyYZh9fLnSua+/CD48TJtYJSHjjYcSaszuxCCk= +github.com/btcsuite/btcwallet/wtxmgr v1.0.0 h1:aIHgViEmZmZfe0tQQqF1xyd2qBqFWxX5vZXkkbjtbeA= +github.com/btcsuite/btcwallet/wtxmgr v1.0.0/go.mod h1:vc4gBprll6BP0UJ+AIGDaySoc7MdAmZf8kelfNb8CFY= +github.com/btcsuite/fastsha256 v0.0.0-20160815193821-637e65642941 h1:kij1x2aL7VE6gtx8KMIt8PGPgI5GV9LgtHFG5KaEMPY= +github.com/btcsuite/fastsha256 v0.0.0-20160815193821-637e65642941/go.mod h1:QcFA8DZHtuIAdYKCq/BzELOaznRsCvwf4zTPmaYwaig= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/golangcrypto v0.0.0-20150304025918-53f62d9b43e8 h1:nOsAWScwueMVk/VLm/dvQQD7DuanyvAUb6B3P3eT274= +github.com/btcsuite/golangcrypto v0.0.0-20150304025918-53f62d9b43e8/go.mod h1:tYvUd8KLhm/oXvUeSEs2VlLghFjQt9+ZaF9ghH0JNjc= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/goleveldb v1.0.0 h1:Tvd0BfvqX9o823q1j2UZ/epQo09eJh6dTcRp79ilIN4= +github.com/btcsuite/goleveldb v1.0.0/go.mod h1:QiK9vBlgftBg6rWQIj6wFzbPfRjiykIEhBH4obrXJ/I= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/snappy-go v1.0.0 h1:ZxaA6lo2EpxGddsA8JwWOcxlzRybb444sgmeJQMJGQE= +github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/coreos/bbolt v1.3.3 h1:n6AiVyVRKQFNb6mJlwESEvvLoDyiTzXX7ORAUlkeBdY= +github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/bbolt v1.3.5 h1:XFv7xaq7701j8ZSEzR28VohFYSlyakMyqNMU5FQH6Ac= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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/dominikh/go-mode.el v1.5.0 h1:04xoxEXj6LpIMrCN8MmTcTKMSC8YLoWsDB0of+Qklc4= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/frankban/quicktest v1.0.0/go.mod h1:R98jIehRai+d1/3Hv2//jOVCTJhW1VBavT6B6CuGq2k= +github.com/frankban/quicktest v1.1.0/go.mod h1:R98jIehRai+d1/3Hv2//jOVCTJhW1VBavT6B6CuGq2k= +github.com/frankban/quicktest v1.2.2/go.mod h1:Qh/WofXFeiAFII1aEBu529AtJo6Zg2VHscnEsbBnJ20= +github.com/frankban/quicktest v1.7.3 h1:kV0lw0TH1j1hozahVmcpFCsbV5hcS4ZalH+U7UoeTow= +github.com/frankban/quicktest v1.7.3/go.mod h1:V1d2J5pfxYH6EjBAgSK7YNXcXlTWxUHdE1sVDXkjnig= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-errors/errors v1.1.1 h1:ljK/pL5ltg3qoN+OtN6yCv9HWSfMwxSx90GJCZQxYNg= +github.com/go-errors/errors v1.1.1/go.mod h1:psDX2osz5VnTOnFWbDeWwS7yejl+uV3FEWEp4lssFEs= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.2.1-0.20190312032427-6f77996f0c42/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c h1:Jx2lEv4nMccTJE+IIZOVIvk+DjNKlRsW0sm1uBr896U= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639 h1:mV02weKRL81bEnm8A0HT1/CAelMQDBuQIfLw8n+d6xI= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jackpal/gateway v1.0.6 h1:/MJORKvJEwNVldtGVJC2p2cwCnsSoLn3hl3zxmZT7tk= +github.com/jackpal/gateway v1.0.6/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89 h1:12K8AlpT0/6QUXSfV0yi4Q0jkbq8NDtIKFtF61AoqV0= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a h1:FaWFmfWdAUKbSCtOU2QjDaorUexogfaMgbipgYATUMU= +github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= +github.com/juju/loggo v0.0.0-20200526014432-9ce3a2e09b5e h1:FdDd7bdI6cjq5vaoYlK1mfQYfF9sF2VZw8VEZMsl5t8= +github.com/juju/loggo v0.0.0-20200526014432-9ce3a2e09b5e/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/juju/mgotest v1.0.1 h1:XvuZ2whmkHZ5G+Y/wQaSe28p2FyTwcBaqTzStn+QaLc= +github.com/juju/mgotest v1.0.1/go.mod h1:vTaDufYul+Ps8D7bgseHjq87X8eu0ivlKLp9mVc/Bfc= +github.com/juju/postgrestest v1.1.0 h1:jEGPSV72rQuQGSzBZfEU15As6FqThPWgNz8ycKD1d1E= +github.com/juju/postgrestest v1.1.0/go.mod h1:/n17Y2T6iFozzXwSCO0JYJ5gSiz2caEtSwAjh/uLXDM= +github.com/juju/qthttptest v0.0.1 h1:pR8nTl6Uo/iI6/ynQf5Cxy9FEICXzaa83NtrBdGMCVQ= +github.com/juju/qthttptest v0.0.1/go.mod h1://LCf/Ls22/rPw2u1yWukUJvYtfPY4nYpWUl2uZhryo= +github.com/juju/schema v1.0.0 h1:sZvJ7iQXHhMw/lJ4YfUmq+fe7R2ZSUzZzd/eSokaB3M= +github.com/juju/schema v1.0.0/go.mod h1:Y+ThzXpUJ0E7NYYocAbuvJ7vTivXfrof/IfRPq/0abI= +github.com/juju/webbrowser v0.0.0-20160309143629-54b8c57083b4 h1:go1FDIXkFL8AUWgJ7B68rtFWCidyrMfZH9x3xwFK74s= +github.com/juju/webbrowser v0.0.0-20160309143629-54b8c57083b4/go.mod h1:G6PCelgkM6cuvyD10iYJsjLBsSadVXtJ+nBxFAxE2BU= +github.com/julienschmidt/httprouter v1.2.0 h1:TDTW5Yz1mjftljbcKqRcrYhd4XeOoI98t+9HbQbYf7g= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/kkdai/bstream v0.0.0-20181106074824-b3251f7901ec/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/kkdai/bstream v1.0.0 h1:Se5gHwgp2VT2uHfDrkbbgbgEvV9cimLELwrPJctSjg8= +github.com/kkdai/bstream v1.0.0/go.mod h1:FDnDOHt5Yx4p3FaHcioFT0QjDOtgUpvjeZqAs+NVZZA= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.3.0 h1:/qkRGz8zljWiDcFvgpwUpwIAPu3r07TDvs3Rws+o/pU= +github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lightninglabs/gozmq v0.0.0-20191113021534-d20a764486bf h1:HZKvJUHlcXI/f/O0Avg7t8sqkPo78HFzjmeYFl6DPnc= +github.com/lightninglabs/gozmq v0.0.0-20191113021534-d20a764486bf/go.mod h1:vxmQPeIQxPf6Jf9rM8R+B4rKBqLA2AjttNxkFBL2Plk= +github.com/lightninglabs/neutrino v0.11.0 h1:lPpYFCtsfJX2W5zI4pWycPmbbBdr7zU+BafYdLoD6k0= +github.com/lightninglabs/neutrino v0.11.0/go.mod h1:CuhF0iuzg9Sp2HO6ZgXgayviFTn1QHdSTJlMncK80wg= +github.com/lightningnetwork/lightning-onion v1.0.1 h1:qChGgS5+aPxFeR6JiUsGvanei1bn6WJpYbvosw/1604= +github.com/lightningnetwork/lightning-onion v1.0.1/go.mod h1:rigfi6Af/KqsF7Za0hOgcyq2PNH4AN70AaMRxcJkff4= +github.com/lightningnetwork/lnd v0.0.2 h1:actrQ68Mrj2atPV7A58FxPzP6Qjwvn0GqkxC9iC0Mlw= +github.com/lightningnetwork/lnd v0.0.2/go.mod h1:wpCSmoRQxoM/vXLtTETeBp08XnB/9/f+sjPvCJZPyA0= +github.com/lightningnetwork/lnd/queue v1.0.1 h1:jzJKcTy3Nj5lQrooJ3aaw9Lau3I0IwvQR5sqtjdv2R0= +github.com/lightningnetwork/lnd/queue v1.0.1/go.mod h1:vaQwexir73flPW43Mrm7JOgJHmcEFBWWSl9HlyASoms= +github.com/lightningnetwork/lnd/ticker v1.0.0 h1:S1b60TEGoTtCe2A0yeB+ecoj/kkS4qpwh6l+AkQEZwU= +github.com/lightningnetwork/lnd/ticker v1.0.0/go.mod h1:iaLXJiVgI1sPANIF2qYYUJXjoksPNvGNYowB8aRbpX0= +github.com/ltcsuite/ltcd v0.20.1-beta h1:ka9ZwUG7oUPppl+7ptuh5VDxGD7TWEJXu/IOOOz1yfY= +github.com/ltcsuite/ltcd v0.20.1-beta/go.mod h1:ZFQaYdYULIuTQiWqs7AUiHD2XhDFeeHW1IH+UYMdABU= +github.com/ltcsuite/ltcutil v0.0.0-20191227053721-6bec450ea6ad h1:ZSvrs99WjvbTwJE1NzCi6OhpOHFRamjTf7lPgo1p20w= +github.com/ltcsuite/ltcutil v0.0.0-20191227053721-6bec450ea6ad/go.mod h1:8Vg/LTOO0KYa/vlHWJ6XZAevPQThGH5sufO0Hrou/lA= +github.com/lunixbochs/vtclean v1.0.0 h1:xu2sLAri4lGiovBDQKxl5mrXyESr3gUr5m5SM5+LVb8= +github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/miekg/dns v1.1.35 h1:oTfOaDH+mZkdcgdIjH6yBajRGtIwcwcaR+rt23ZSrJs= +github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns/vendor/golang.org/x/crypto v0.0.0-20190628154026-b13675009d59 h1:AG/2PIupuBe73yAIK3lT76yhUlutrUejoEqsQBpHBc4= +github.com/miekg/dns/vendor/golang.org/x/net v0.0.0-20190628154026-b13675009d59 h1:WsDpNcS4U/uhzydPL/hG1k4yHVulEq1Ory3/k7hyUYI= +github.com/miekg/dns/vendor/golang.org/x/sys v0.0.0-20190628154026-b13675009d59 h1:nCLNt0bnbBD2+Vh82Szf975Pq0epy5YzuamsmuRhsV8= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d h1:AREM5mwr4u1ORQBMvzfzBgpsctsbQikCVpvC+tX285E= +github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/roasbeef/btcd v0.0.0-20180418012700-a03db407e40d h1:3p7ZK0clyDVNQL3a5q4jTaTDv5YzW4AxkdftpBZxsrU= +github.com/roasbeef/btcd v0.0.0-20180418012700-a03db407e40d/go.mod h1:A6JDd1s2zvd0LJNnhvindLqoL7gzisoxi5QlvRH7rmY= +github.com/roasbeef/btcrpcclient v0.0.0-20170622074026-d0f4db8b4dad h1:CUwA46cQ1abMrOc8Qjxfi4VS1rThf+/tpBoMGqQdXxI= +github.com/roasbeef/btcrpcclient v0.0.0-20170622074026-d0f4db8b4dad/go.mod h1:pifwSYHPshWU3rt0bWMWh4pOIIWLs8DBfMhIsXRR9Nc= +github.com/roasbeef/btcutil v0.0.0-20180406014609-dfb640c57141 h1:Ff9AGVuxwGC3rmvHvmfr0sGjB0ybNYMn9TzgdkGbrOg= +github.com/roasbeef/btcutil v0.0.0-20180406014609-dfb640c57141/go.mod h1:rt+VEaQjfoxd3IOujqxoF9v3uy1ygl7Gk8Q5y3Kv+Lw= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af h1:gu+uRPtBe88sKxUCEXRoeCvVG90TJmwhiqRpvdhQFng= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +github.com/tv42/zbase32 v0.0.0-20190604154422-aacc64a8f915 h1:vX9DBbEHmrebYnVthUTzMO6Zc1vvConJdD2s0uvXrfw= +github.com/tv42/zbase32 v0.0.0-20190604154422-aacc64a8f915/go.mod h1:Y5DJgF9Eou+hSWetC39Mns8E0PU7DykCLNWiYeOINrE= +github.com/urfave/cli v1.22.4 h1:u7tSpNPPswAFymm8IehJhy4uJMlUuU/GmqSkvJ1InXA= +github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32 h1:5tjfNdR2ki3yYQ842+eX2sQHeiwpKJ0RnHO4IYOc4V8= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +gitlab.com/NebulousLabs/fastrand v0.0.0-20181126182046-603482d69e40 h1:dizWJqTWjwyD8KGcMOwgrkqu1JIkofYgKkmDeNE7oAs= +gitlab.com/NebulousLabs/fastrand v0.0.0-20181126182046-603482d69e40/go.mod h1:rOnSnoRyxMI3fe/7KIbVcsHRGxe30OONv8dEgo+vCfA= +gitlab.com/NebulousLabs/go-upnp v0.0.0-20181011194642-3a71999ed0d3 h1:qXqiXDgeQxspR3reot1pWme00CX1pXbxesdzND+EjbU= +gitlab.com/NebulousLabs/go-upnp v0.0.0-20181011194642-3a71999ed0d3/go.mod h1:sleOmkovWsDEQVYXmOJhx69qheoMTmCuPYyiCFCihlg= +go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +go4.org v0.0.0-20190218023631-ce4c26f7be8e h1:m9LfARr2VIOW0vsV19kEKp/sWQvZnGobA8JHui/XJoY= +go4.org v0.0.0-20190218023631-ce4c26f7be8e/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= +golang.org/x/build v0.0.0-20190509182522-45de920fc22c h1:lgCiAYQNZHWRJOB1au5nVtnBZS1ZmKN1DpViRg23ZZc= +golang.org/x/build v0.0.0-20190509182522-45de920fc22c/go.mod h1:fYw7AShPAhGMdXqA9gRadk/CcMsvLlClpE5oBwnS3dM= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb h1:Ah9YqXLj6fEgeKqcmBuLCbAsrF3ScD7dJ/bYM0C6tXI= +golang.org/x/crypto v0.0.0-20180723164146-c126467f60eb/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5 h1:bselrhR0Or1vomJZC8ZIjWtbDmn9OYFLX5Ik9alpJpE= +golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190424203555-c05e17bb3b2d/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d h1:2+ZP7EfsZV7Vvmx3TIqSlSzATMkTAKqM14YGFPoSKjI= +golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20150829230318-ea47fc708ee3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190206173232-65e2d4e15006/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190502183928-7f726cade0ab/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478 h1:l5EDrHhldLYb3ZRHDUhXF7Om7MvYXnkV9/iQNo1lX6g= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102 h1:42cLlJJdEh+ySyeUUbEQ5bsTiq8voBeTuweGVkY6Puw= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net/http2/h2demo v0.0.0-20201031054903-ff519b6c9102 h1:MlMASTIaEj2JjQCEewGhj7TEtGD4uoIvamLoYM9QxRU= +golang.org/x/net/http2/h2demo v0.0.0-20201031054903-ff519b6c9102/go.mod h1:Hr3tdaG4J+kFo5oVmQmj9KahfPFQQRL31ZOBpfSP6do= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae h1:Ih9Yo4hSPImZOpfGuA4bR/ORKTAbhZo2AbWNRCnevdo= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 h1:B6caxRw+hozq68X2MY7jEpZh/cr4/aHLv9xU8Kkadrw= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201101102859-da207088b7d1 h1:a/mKvvZr9Jcc8oKfcmgzyp7OwF73JPWsQLvH1z2Kxck= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2 h1:z99zHgr7hKfrUcX/KsoJk5FJfjTceCKIp96+biqP4To= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181008205924-a2b3f7f249e9/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135 h1:5Beo0mZN8dRzgrMMkDp0jc8YXQKx9DiJ2k1dkvGsn5A= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425 h1:VvQyQJN0tSuecqgcIxMWnnfG5kSmgy9KZR9sW3W5QeA= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200731060945-b5fad4ed8dd6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200806022845-90696ccdc692 h1:fsn47thVa7Ar/TMyXYlZgOoT7M4+kRpb+KpSAqRQx1w= +golang.org/x/tools v0.0.0-20200806022845-90696ccdc692/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20201028153306-37f0764111ff h1:TU04fJ6/hxmk+6BeFPKM3iuCGqj0ep6ghDdEdhN1cnk= +golang.org/x/tools v0.0.0-20201028153306-37f0764111ff/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201102043006-b53d4cbd60a6 h1:vTr2e3iWbC27MMR83IzSZeEKQSzJAhwDM+Ld5YSaHA0= +golang.org/x/tools v0.0.0-20201102043006-b53d4cbd60a6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools/gopls v0.5.2 h1:lyHTekqy0QhXzz5hDFnfMGHk0Qmuq+LWH5VN/o19YLk= +golang.org/x/tools/gopls v0.5.2/go.mod h1:Ye30ua0XTIpPhh5d9Mdz5ohQchW2pCnpwCj24FWNw9g= +golang.org/x/vgo v0.0.0-20180912184537-9d567625acf4 h1:ouUW0k6XvH360Tr2/HkzQWY7/aU+3QVkfWnrRNf2udQ= +golang.org/x/vgo v0.0.0-20180912184537-9d567625acf4/go.mod h1:rPwukS3Aj8LZv1dK2rFNXSfYxdueYuvBJ7u3uL3f47I= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0 h1:yfrXXP61wVuLb0vBcG6qaOoIoqYEzOQS8jum51jkv2w= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190201180003-4b09977fb922/go.mod h1:L3J43x8/uS+qIUoksaLKe6OS3nUKxOKuIFz1sl2/jx4= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884 h1:fiNLklpBwWK1mth30Hlwk+fcdBmIALlgF5iy77O37Ig= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98 h1:LCO0fg4kb6WwkXQXRQQgUYsFeFb5taTX5WAx5O/Vt28= +google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0 h1:d0rYPqjQfVuFe+tZgv4PHt2hNxK79MRXX7PaD/A5ynA= +google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= +google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1 h1:DGeFlSan2f+WEtCERJ4J9GJWk15TxUi8QGagfI87Xyc= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc/examples v0.0.0-20201030225255-4e179b8d3ec4 h1:QUxBG/vAe9+Elhp9TSi45QQOe5b+JtswBBDKzRjUHR0= +google.golang.org/grpc/examples v0.0.0-20201030225255-4e179b8d3ec4/go.mod h1:IBqQ7wSUJ2Ep09a8rMWFsg4fmI2r38zwsq8a0GgxXpM= +google.golang.org/grpc/test/tools v0.0.0-20201030225255-4e179b8d3ec4 h1:VVctedX2WCsBUeR+woUWcdK0lDDQQhdGLUm8kJVXKsU= +google.golang.org/grpc/test/tools v0.0.0-20201030225255-4e179b8d3ec4/go.mod h1:5ws+vck/rGEd+7utgoVggaUSA2idBL2I7Tl53EMAbvo= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v1 v1.0.0/go.mod h1:CxwszS/Xz1C49Ucd2i6Zil5UToP1EmyrFhKaMVbg1mk= +gopkg.in/errgo.v1 v1.0.1 h1:oQFRXzZ7CkBGdm1XZm/EbQYaYNNEElNBOd09M6cqNso= +gopkg.in/errgo.v1 v1.0.1/go.mod h1:3NjfXwocQRYAPTq4/fzX+CwUhPRcR/azYRhj8G+LqMo= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/httprequest.v1 v1.2.0 h1:YTGV1oXzaoKI6oPzQ0knoIPcrrVzeRG3amkoxoP7Xng= +gopkg.in/httprequest.v1 v1.2.0/go.mod h1:T61ZUaJLpMnzvoJDO03ZD8yRXD4nZzBeDoW5e9sffjg= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/juju/environschema.v1 v1.0.0 h1:51vT1bzbP9fntQ0I9ECSlku2p19Szj/N2beZFeIH2kM= +gopkg.in/juju/environschema.v1 v1.0.0/go.mod h1:WTgU3KXKCVoO9bMmG/4KHzoaRvLeoxfjArpgd1MGWFA= +gopkg.in/macaroon-bakery.v2 v2.2.0 h1:tgib3W6Nz8GhYfF83vp0FEZmncj6UE1ubIG7a09flkc= +gopkg.in/macaroon-bakery.v2 v2.2.0/go.mod h1:XyHjEinGUBsCK60Qv+bBejOQD/WklvntpSVGja9utaU= +gopkg.in/macaroon.v2 v2.1.0 h1:HZcsjBCzq9t0eBPMKqTN/uSN6JOm78ZJ2INbqcBQOUI= +gopkg.in/macaroon.v2 v2.1.0/go.mod h1:OUb+TQP/OP0WOerC2Jp/3CwhIKyIa9kQjuc7H24e6/o= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3 h1:fvjTMHxHEw/mxHbtzPi3JCcKXQRAnQTBRo6YCJSVHKI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopl.io v0.0.0-20200323155855-65c318dde95e h1:Z2obUjDpRealS0n+wq0nZ0tAyl+vY1txRLsZ/EY7XNM= +gopl.io v0.0.0-20200323155855-65c318dde95e/go.mod h1:k9MBtwj/WjioNgt7Buity/chxOPmJqkZ5bEaeT4JVm4= +grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.5 h1:nI5egYTGJakVyOryqLs1cQO5dO0ksin5XXs2pspk75k= +honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +mvdan.cc/gofumpt v0.0.0-20200802201014-ab5a8192947d h1:t8TAw9WgTLghti7RYkpPmqk4JtQ3+wcP5GgZqgWeWLQ= +mvdan.cc/gofumpt v0.0.0-20200802201014-ab5a8192947d/go.mod h1:bzrjFmaD6+xqohD3KYP0H2FEuxknnBmyyOxdhLdaIws= +mvdan.cc/xurls/v2 v2.2.0 h1:NSZPykBXJFCetGZykLAxaL6SIpvbVy/UFEniIfHAa8A= +mvdan.cc/xurls/v2 v2.2.0/go.mod h1:EV1RMtya9D6G5DMYPGD8zTQzaHet6Jh8gFlRgGRJeO8= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/resolve/resolve.go b/resolve/resolve.go index e4b67521..26d74b4f 100644 --- a/resolve/resolve.go +++ b/resolve/resolve.go @@ -100,7 +100,7 @@ const doesnt = "this Starlark dialect does not " var ( AllowNestedDef = false // allow def statements within function bodies AllowLambda = false // allow lambda expressions - AllowFloat = false // allow floating point literals, the 'float' built-in, and x / y + AllowFloat = false // obsolete; no effect AllowSet = false // allow the 'set' built-in AllowGlobalReassign = false // allow reassignment to top-level names; also, allow if/for/while at top-level AllowRecursion = false // allow while statements and recursive functions @@ -418,9 +418,6 @@ func (r *resolver) useToplevel(use use) (bind *Binding) { r.predeclared[id.Name] = bind // save it } else if r.isUniversal(id.Name) { // use of universal name - if !AllowFloat && id.Name == "float" { - r.errorf(id.NamePos, doesnt+"support floating point") - } if !AllowSet && id.Name == "set" { r.errorf(id.NamePos, doesnt+"support sets") } @@ -636,9 +633,6 @@ func (r *resolver) expr(e syntax.Expr) { r.use(e) case *syntax.Literal: - if !AllowFloat && e.Token == syntax.FLOAT { - r.errorf(e.TokenPos, doesnt+"support floating point") - } case *syntax.ListExpr: for _, x := range e.List { @@ -713,9 +707,6 @@ func (r *resolver) expr(e syntax.Expr) { r.expr(e.X) case *syntax.BinaryExpr: - if !AllowFloat && e.Op == syntax.SLASH { - r.errorf(e.OpPos, doesnt+"support floating point (use //)") - } r.expr(e.X) r.expr(e.Y) diff --git a/resolve/resolve_test.go b/resolve/resolve_test.go index 090dbc54..cb2c6724 100644 --- a/resolve/resolve_test.go +++ b/resolve/resolve_test.go @@ -15,7 +15,6 @@ import ( ) func setOptions(src string) { - resolve.AllowFloat = option(src, "float") resolve.AllowGlobalReassign = option(src, "globalreassign") resolve.AllowLambda = option(src, "lambda") resolve.AllowNestedDef = option(src, "nesteddef") @@ -38,7 +37,7 @@ func TestResolve(t *testing.T) { continue } - // A chunk may set options by containing e.g. "option:float". + // A chunk may set options by containing e.g. "option:nesteddef". setOptions(chunk.Source) if err := resolve.File(f, isPredeclared, isUniversal); err != nil { diff --git a/resolve/testdata/resolve.star b/resolve/testdata/resolve.star index 4f1a270d..8399bf39 100644 --- a/resolve/testdata/resolve.star +++ b/resolve/testdata/resolve.star @@ -307,12 +307,7 @@ def h(kwargs, a, **kwargs): pass ### "duplicate parameter: kwargs" def i(*x, **x): pass ### "duplicate parameter: x" --- -# No floating point -a = float("3.141") ### `dialect does not support floating point` -b = 1 / 2 ### `dialect does not support floating point \(use //\)` -c = 3.141 ### `dialect does not support floating point` ---- -# Floating point support (option:float) +# Floating-point support is now standard. a = float("3.141") b = 1 / 2 c = 3.141 diff --git a/starlark/eval.go b/starlark/eval.go index c17b8b74..633fc302 100644 --- a/starlark/eval.go +++ b/starlark/eval.go @@ -713,14 +713,22 @@ func Binary(op syntax.Token, x, y Value) (Value, error) { case Int: return x.Add(y), nil case Float: - return x.Float() + y, nil + xf, err := x.finiteFloat() + if err != nil { + return nil, err + } + return xf + y, nil } case Float: switch y := y.(type) { case Float: return x + y, nil case Int: - return x + y.Float(), nil + yf, err := y.finiteFloat() + if err != nil { + return nil, err + } + return x + yf, nil } case *List: if y, ok := y.(*List); ok { @@ -745,14 +753,22 @@ func Binary(op syntax.Token, x, y Value) (Value, error) { case Int: return x.Sub(y), nil case Float: - return x.Float() - y, nil + xf, err := x.finiteFloat() + if err != nil { + return nil, err + } + return xf - y, nil } case Float: switch y := y.(type) { case Float: return x - y, nil case Int: - return x - y.Float(), nil + yf, err := y.finiteFloat() + if err != nil { + return nil, err + } + return x - yf, nil } } @@ -763,7 +779,11 @@ func Binary(op syntax.Token, x, y Value) (Value, error) { case Int: return x.Mul(y), nil case Float: - return x.Float() * y, nil + xf, err := x.finiteFloat() + if err != nil { + return nil, err + } + return xf * y, nil case String: return stringRepeat(y, x) case *List: @@ -780,7 +800,11 @@ func Binary(op syntax.Token, x, y Value) (Value, error) { case Float: return x * y, nil case Int: - return x * y.Float(), nil + yf, err := y.finiteFloat() + if err != nil { + return nil, err + } + return x * yf, nil } case String: if y, ok := y.(Int); ok { @@ -804,30 +828,40 @@ func Binary(op syntax.Token, x, y Value) (Value, error) { case syntax.SLASH: switch x := x.(type) { case Int: + xf, err := x.finiteFloat() + if err != nil { + return nil, err + } switch y := y.(type) { case Int: - yf := y.Float() + yf, err := y.finiteFloat() + if err != nil { + return nil, err + } if yf == 0.0 { - return nil, fmt.Errorf("real division by zero") + return nil, fmt.Errorf("floating-point division by zero") } - return x.Float() / yf, nil + return xf / yf, nil case Float: if y == 0.0 { - return nil, fmt.Errorf("real division by zero") + return nil, fmt.Errorf("floating-point division by zero") } - return x.Float() / y, nil + return xf / y, nil } case Float: switch y := y.(type) { case Float: if y == 0.0 { - return nil, fmt.Errorf("real division by zero") + return nil, fmt.Errorf("floating-point division by zero") } return x / y, nil case Int: - yf := y.Float() + yf, err := y.finiteFloat() + if err != nil { + return nil, err + } if yf == 0.0 { - return nil, fmt.Errorf("real division by zero") + return nil, fmt.Errorf("floating-point division by zero") } return x / yf, nil } @@ -843,10 +877,14 @@ func Binary(op syntax.Token, x, y Value) (Value, error) { } return x.Div(y), nil case Float: + xf, err := x.finiteFloat() + if err != nil { + return nil, err + } if y == 0.0 { return nil, fmt.Errorf("floored division by zero") } - return floor((x.Float() / y)), nil + return floor(xf / y), nil } case Float: switch y := y.(type) { @@ -856,7 +894,10 @@ func Binary(op syntax.Token, x, y Value) (Value, error) { } return floor(x / y), nil case Int: - yf := y.Float() + yf, err := y.finiteFloat() + if err != nil { + return nil, err + } if yf == 0.0 { return nil, fmt.Errorf("floored division by zero") } @@ -874,23 +915,31 @@ func Binary(op syntax.Token, x, y Value) (Value, error) { } return x.Mod(y), nil case Float: + xf, err := x.finiteFloat() + if err != nil { + return nil, err + } if y == 0 { - return nil, fmt.Errorf("float modulo by zero") + return nil, fmt.Errorf("floating-point modulo by zero") } - return x.Float().Mod(y), nil + return xf.Mod(y), nil } case Float: switch y := y.(type) { case Float: if y == 0.0 { - return nil, fmt.Errorf("float modulo by zero") + return nil, fmt.Errorf("floating-point modulo by zero") } return x.Mod(y), nil case Int: if y.Sign() == 0 { - return nil, fmt.Errorf("float modulo by zero") + return nil, fmt.Errorf("floating-point modulo by zero") } - return x.Mod(y.Float()), nil + yf, err := y.finiteFloat() + if err != nil { + return nil, err + } + return x.Mod(yf), nil } case String: return interpolate(string(x), y) @@ -1497,20 +1546,7 @@ func interpolate(format string, x Value) (Value, error) { if !ok { return nil, fmt.Errorf("%%%c format requires float, not %s", c, arg.Type()) } - switch c { - case 'e': - fmt.Fprintf(buf, "%e", f) - case 'f': - fmt.Fprintf(buf, "%f", f) - case 'g': - fmt.Fprintf(buf, "%g", f) - case 'E': - fmt.Fprintf(buf, "%E", f) - case 'F': - fmt.Fprintf(buf, "%F", f) - case 'G': - fmt.Fprintf(buf, "%G", f) - } + Float(f).format(buf, c) case 'c': switch arg := arg.(type) { case Int: diff --git a/starlark/eval_test.go b/starlark/eval_test.go index a57ccad5..13876a72 100644 --- a/starlark/eval_test.go +++ b/starlark/eval_test.go @@ -24,7 +24,6 @@ import ( // A test may enable non-standard options by containing (e.g.) "option:recursion". func setOptions(src string) { - resolve.AllowFloat = option(src, "float") resolve.AllowGlobalReassign = option(src, "globalreassign") resolve.LoadBindsGlobally = option(src, "loadbindsglobally") resolve.AllowLambda = option(src, "lambda") diff --git a/starlark/int.go b/starlark/int.go index c40532a7..397be865 100644 --- a/starlark/int.go +++ b/starlark/int.go @@ -193,6 +193,16 @@ func (i Int) Float() Float { return Float(iSmall) } +// finiteFloat returns the finite float value nearest i, +// or an error if the magnitude is too large. +func (i Int) finiteFloat() (Float, error) { + f := i.Float() + if math.IsInf(float64(f), 0) { + return 0, fmt.Errorf("int too large to convert to float") + } + return f, nil +} + func (x Int) Sign() int { xSmall, xBig := x.get() if xBig != nil { diff --git a/starlark/library.go b/starlark/library.go index 9036877e..e9e2f949 100644 --- a/starlark/library.go +++ b/starlark/library.go @@ -12,6 +12,7 @@ package starlark import ( "errors" "fmt" + "math" "math/big" "os" "sort" @@ -46,7 +47,7 @@ func init() { "dir": NewBuiltin("dir", dir), "enumerate": NewBuiltin("enumerate", enumerate), "fail": NewBuiltin("fail", fail), - "float": NewBuiltin("float", float), // requires resolve.AllowFloat + "float": NewBuiltin("float", float), "getattr": NewBuiltin("getattr", getattr), "hasattr": NewBuiltin("hasattr", hasattr), "hash": NewBuiltin("hash", hash), @@ -330,13 +331,39 @@ func float(thread *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error return Float(0.0), nil } case Int: - return x.Float(), nil + return x.finiteFloat() case Float: return x, nil case String: - f, err := strconv.ParseFloat(string(x), 64) + if x == "" { + return nil, fmt.Errorf("float: empty string") + } + // +/- NaN or Inf or Infinity (case insensitive)? + s := string(x) + switch x[len(x)-1] { + case 'y', 'Y': + if strings.EqualFold(s, "infinity") || strings.EqualFold(s, "+infinity") { + return inf, nil + } else if strings.EqualFold(s, "-infinity") { + return neginf, nil + } + case 'f', 'F': + if strings.EqualFold(s, "inf") || strings.EqualFold(s, "+inf") { + return inf, nil + } else if strings.EqualFold(s, "-inf") { + return neginf, nil + } + case 'n', 'N': + if strings.EqualFold(s, "nan") || strings.EqualFold(s, "+nan") || strings.EqualFold(s, "-nan") { + return nan, nil + } + } + f, err := strconv.ParseFloat(s, 64) + if math.IsInf(f, 0) { + return nil, fmt.Errorf("floating-point number too large") + } if err != nil { - return nil, nameErr(b, err) + return nil, fmt.Errorf("invalid float literal: %s", s) } return Float(f), nil default: @@ -344,6 +371,12 @@ func float(thread *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error } } +var ( + inf = Float(math.Inf(+1)) + neginf = Float(math.Inf(-1)) + nan = Float(math.NaN()) +) + // https://github.com/google/starlark-go/blob/master/doc/spec.md#getattr func getattr(thread *Thread, b *Builtin, args Tuple, kwargs []Tuple) (Value, error) { var object, dflt Value diff --git a/starlark/testdata/assign.star b/starlark/testdata/assign.star index 38108f94..64d60fb6 100644 --- a/starlark/testdata/assign.star +++ b/starlark/testdata/assign.star @@ -232,14 +232,11 @@ assert.fails(lambda: tuple, "global variable tuple referenced before assignment" tuple = () --- -# option:float option:set -# Same as above, but set and float are dialect-specific; +# option:set +# Same as above, but set is dialect-specific; # we shouldn't notice any difference. load("assert.star", "assert") -float = 1.0 -assert.eq(type(float), "float") - set = [1, 2, 3] assert.eq(type(set), "list") diff --git a/starlark/testdata/bool.star b/starlark/testdata/bool.star index 78ef825f..6c084a3d 100644 --- a/starlark/testdata/bool.star +++ b/starlark/testdata/bool.star @@ -1,5 +1,4 @@ # Tests of Starlark 'bool' -# option:float load("assert.star", "assert") @@ -9,6 +8,13 @@ assert.true(not False) assert.true(not not True) assert.true(not not 1 >= 1) +# precedence of not +assert.true(not not 2 > 1) +# assert.true(not (not 2) > 1) # TODO(adonovan): fix: gives error for False > 1. +# assert.true(not ((not 2) > 1)) # TODO(adonovan): fix +# assert.true(not ((not (not 2)) > 1)) # TODO(adonovan): fix +# assert.true(not not not (2 > 1)) + # bool conversion assert.eq( [bool(), bool(1), bool(0), bool("hello"), bool("")], diff --git a/starlark/testdata/builtins.star b/starlark/testdata/builtins.star index 2385c16a..8dcee46b 100644 --- a/starlark/testdata/builtins.star +++ b/starlark/testdata/builtins.star @@ -1,5 +1,5 @@ # Tests of Starlark built-in functions -# option:float option:set +# option:set load("assert.star", "assert") diff --git a/starlark/testdata/float.star b/starlark/testdata/float.star index 4d7a2695..b4df38d4 100644 --- a/starlark/testdata/float.star +++ b/starlark/testdata/float.star @@ -1,5 +1,5 @@ # Tests of Starlark 'float' -# option:float option:set +# option:set load("assert.star", "assert") @@ -7,6 +7,20 @@ load("assert.star", "assert") # - precision # - limits +# type +assert.eq(type(0.0), "float") + +# truth +assert.true(123.0) +assert.true(-1.0) +assert.true(not 0.0) +assert.true(-1.0e-45) +assert.true(float("NaN")) + +# not iterable +assert.fails(lambda: len(0.0), 'has no len') +assert.fails(lambda: [x for x in 0.0], 'float value is not iterable') + # literals assert.eq(type(1.234), "float") assert.eq(type(1e10), "float") @@ -16,10 +30,117 @@ assert.eq(type(1.234e10), "float") assert.eq(type(1.234e+10), "float") assert.eq(type(1.234e-10), "float") -# truth -assert.true(123.0) -assert.true(-1.0) -assert.true(not 0.0) +# int/float equality +assert.eq(0.0, 0) +assert.eq(0, 0.0) +assert.eq(1.0, 1) +assert.eq(1, 1.0) +assert.true(1.23e45 != 1229999999999999973814869011019624571608236031) +assert.true(1.23e45 == 1229999999999999973814869011019624571608236032) +assert.true(1.23e45 != 1229999999999999973814869011019624571608236033) +assert.true(1229999999999999973814869011019624571608236031 != 1.23e45) +assert.true(1229999999999999973814869011019624571608236032 == 1.23e45) +assert.true(1229999999999999973814869011019624571608236033 != 1.23e45) + +# loss of precision +p53 = 1<<53 +assert.eq(float(p53-1), p53-1) +assert.eq(float(p53+0), p53+0) +assert.eq(float(p53+1), p53+0) # +assert.eq(float(p53+2), p53+2) +assert.eq(float(p53+3), p53+4) # +assert.eq(float(p53+4), p53+4) +assert.eq(float(p53+5), p53+4) # +assert.eq(float(p53+6), p53+6) +assert.eq(float(p53+7), p53+8) # +assert.eq(float(p53+8), p53+8) + +assert.true(float(p53+1) != p53+1) # comparisons are exact +assert.eq(float(p53+1) - (p53+1), 0) # arithmetic entails rounding + +assert.fails(lambda: {123.0: "f", 123: "i"}, "duplicate key: 123") + +# equal int/float values have same hash +d = {123.0: "x"} +d[123] = "y" +assert.eq(len(d), 1) +assert.eq(d[123.0], "y") + +# literals (mostly covered by scanner tests) +assert.eq(str(0.), "0.0") +assert.eq(str(.0), "0.0") +assert.true(5.0 != 4.999999999999999) +assert.eq(5.0, 4.9999999999999999) # both literals denote 5.0 +assert.eq(1.23e45, 1.23 * 1000000000000000000000000000000000000000000000) +assert.eq(str(1.23e-45 - (1.23 / 1000000000000000000000000000000000000000000000)), "-1.5557538194652854e-61") + +nan = float("NaN") +inf = float("+Inf") +neginf = float("-Inf") +negzero = (-1e-323 / 10) + +# -- arithmetic -- + +# +float, -float +assert.eq(+(123.0), 123.0) +assert.eq(-(123.0), -123.0) +assert.eq(-(-(123.0)), 123.0) +assert.eq(+(inf), inf) +assert.eq(-(inf), neginf) +assert.eq(-(neginf), inf) +assert.eq(str(-(nan)), "nan") +# + +assert.eq(1.2e3 + 5.6e7, 5.60012e+07) +assert.eq(1.2e3 + 1, 1201) +assert.eq(1 + 1.2e3, 1201) +assert.eq(str(1.2e3 + nan), "nan") +assert.eq(inf + 0, inf) +assert.eq(inf + 1, inf) +assert.eq(inf + inf, inf) +assert.eq(str(inf + neginf), "nan") +# - +assert.eq(1.2e3 - 5.6e7, -5.59988e+07) +assert.eq(1.2e3 - 1, 1199) +assert.eq(1 - 1.2e3, -1199) +assert.eq(str(1.2e3 - nan), "nan") +assert.eq(inf - 0, inf) +assert.eq(inf - 1, inf) +assert.eq(str(inf - inf), "nan") +assert.eq(inf - neginf, inf) +# * +assert.eq(1.5e6 * 2.2e3, 3.3e9) +assert.eq(1.5e6 * 123, 1.845e+08) +assert.eq(123 * 1.5e6, 1.845e+08) +assert.eq(str(1.2e3 * nan), "nan") +assert.eq(str(inf * 0), "nan") +assert.eq(inf * 1, inf) +assert.eq(inf * inf, inf) +assert.eq(inf * neginf, neginf) +# % +assert.eq(100.0 % 7.0, 2) +assert.eq(100.0 % -7.0, -5) # NB: different from Go / Java +assert.eq(-100.0 % 7.0, 5) # NB: different from Go / Java +assert.eq(-100.0 % -7.0, -2) +assert.eq(-100.0 % 7, 5) +assert.eq(100 % 7.0, 2) +assert.eq(str(1.2e3 % nan), "nan") +assert.eq(str(inf % 1), "nan") +assert.eq(str(inf % inf), "nan") +assert.eq(str(inf % neginf), "nan") +# / +assert.eq(str(100.0 / 7.0), "14.285714285714286") +assert.eq(str(100 / 7.0), "14.285714285714286") +assert.eq(str(100.0 / 7), "14.285714285714286") +assert.eq(str(100.0 / nan), "nan") +# // +assert.eq(100.0 // 7.0, 14) +assert.eq(100 // 7.0, 14) +assert.eq(100.0 // 7, 14) +assert.eq(100.0 // -7.0, -15) +assert.eq(100 // -7.0, -15) +assert.eq(100.0 // -7, -15) +assert.eq(str(1 // neginf), "-0.0") +assert.eq(str(100.0 // nan), "nan") # addition assert.eq(0.0 + 1.0, 1.0) @@ -56,9 +177,9 @@ assert.eq(2.5 / 2.0, 1.25) assert.eq(2.5 / 2, 1.25) assert.eq(5 / 4.0, 1.25) assert.eq(5 / 4, 1.25) -assert.fails(lambda: 1.0 / 0, "real division by zero") -assert.fails(lambda: 1.0 / 0.0, "real division by zero") -assert.fails(lambda: 1 / 0.0, "real division by zero") +assert.fails(lambda: 1.0 / 0, "floating-point division by zero") +assert.fails(lambda: 1.0 / 0.0, "floating-point division by zero") +assert.fails(lambda: 1 / 0.0, "floating-point division by zero") # floored division assert.eq(100.0 // 8.0, 12.0) @@ -90,64 +211,69 @@ assert.eq(-98.0 % -8.0, -2.0) assert.eq(2.5 % 2.0, 0.5) assert.eq(2.5 % 2, 0.5) assert.eq(5 % 4.0, 1.0) -assert.fails(lambda: 1.0 % 0, "float modulo by zero") -assert.fails(lambda: 1.0 % 0.0, "float modulo by zero") -assert.fails(lambda: 1 % 0.0, "float modulo by zero") +assert.fails(lambda: 1.0 % 0, "floating-point modulo by zero") +assert.fails(lambda: 1.0 % 0.0, "floating-point modulo by zero") +assert.fails(lambda: 1 % 0.0, "floating-point modulo by zero") # floats cannot be used as indices, even if integral assert.fails(lambda: "abc"[1.0], "want int") assert.fails(lambda: ["A", "B", "C"].insert(1.0, "D"), "want int") +assert.fails(lambda: range(3)[1.0], "got float, want int") -# nan -nan = float("NaN") -def isnan(x): return x != x -assert.true(nan != nan) -assert.true(not (nan == nan)) - -# ordered comparisons with NaN -assert.true(not nan < nan) -assert.true(not nan > nan) -assert.true(not nan <= nan) -assert.true(not nan >= nan) -assert.true(not nan == nan) # use explicit operator, not assert.ne -assert.true(nan != nan) -assert.true(not nan < 0) -assert.true(not nan > 0) -assert.true(not [nan] < [nan]) -assert.true(not [nan] > [nan]) - -# Even a value containing NaN is not equal to itself. -nanlist = [nan] -assert.true(not nanlist < nanlist) -assert.true(not nanlist > nanlist) -assert.ne(nanlist, nanlist) - -# Since NaN values never compare equal, -# a dict may have any number of NaN keys. -nandict = {nan: 1, nan: 2, nan: 3} -assert.eq(len(nandict), 3) -assert.eq(str(nandict), "{NaN: 1, NaN: 2, NaN: 3}") -assert.true(nan not in nandict) -assert.eq(nandict.get(nan, None), None) +# -- comparisons -- +# NaN +assert.true(nan == nan) # \ +assert.true(nan >= nan) # unlike Python +assert.true(nan <= nan) # / +assert.true(not (nan > nan)) +assert.true(not (nan < nan)) +assert.true(not (nan != nan)) # unlike Python +# Sort is stable: 0.0 and -0.0 are equal, but they are not permuted. +# Similarly 1 and 1.0. +assert.eq( + str(sorted([inf, neginf, nan, 1e300, -1e300, 1.0, -1.0, 1, -1, 1e-300, -1e-300, 0, 0.0, negzero, 1e-300, -1e-300])), + "[-inf, -1e+300, -1.0, -1, -1e-300, -1e-300, 0, 0.0, -0.0, 1e-300, 1e-300, 1.0, 1, 1e+300, +inf, nan]") + +# Sort is stable, and its result contains no adjacent x, y such that y > x. +# Note: Python's reverse sort is unstable; see https://bugs.python.org/issue36095. +assert.eq(str(sorted([7, 3, nan, 1, 9])), "[1, 3, 7, 9, nan]") +assert.eq(str(sorted([7, 3, nan, 1, 9], reverse=True)), "[nan, 9, 7, 3, 1]") + +# All NaN values compare equal. (Identical objects compare equal.) +nandict = {nan: 1} +nandict[nan] = 2 +assert.eq(len(nandict), 1) # (same as Python) +assert.eq(nandict[nan], 2) # (same as Python) +assert.fails(lambda: {nan: 1, nan: 2}, "duplicate key: nan") + +nandict[float('nan')] = 3 # a distinct NaN object +assert.eq(str(nandict), "{nan: 3}") # (Python: {nan: 2, nan: 3}) + +assert.eq(str({inf: 1, neginf: 2}), "{+inf: 1, -inf: 2}") + +# zero +assert.eq(0.0, negzero) # inf -inf = float("Inf") -neginf = float("-Inf") -assert.true(isnan(+inf / +inf)) -assert.true(isnan(+inf / -inf)) -assert.true(isnan(-inf / +inf)) +assert.eq(+inf / +inf, nan) +assert.eq(+inf / -inf, nan) +assert.eq(-inf / +inf, nan) assert.eq(0.0 / +inf, 0.0) assert.eq(0.0 / -inf, 0.0) assert.true(inf > -inf) assert.eq(inf, -neginf) -assert.eq(float(int("2" + "0" * 308)), inf) # 2e308 is too large to represent as a float -assert.eq(float(int("-2" + "0" * 308)), -inf) # TODO(adonovan): assert inf > any finite number, etc. # negative zero negz = -0 assert.eq(negz, 0) +# min/max ordering with NaN (the greatest float value) +assert.eq(max([1, nan, 3]), nan) +assert.eq(max([nan, 2, 3]), nan) +assert.eq(min([1, nan, 3]), 1) +assert.eq(min([nan, 2, 3]), 2) + # float/float comparisons fltmax = 1.7976931348623157e+308 # approx fltmin = 4.9406564584124654e-324 # approx @@ -178,25 +304,75 @@ assert.eq(int(1e100), int("10000000000000000159028911097599180468360808563945281 assert.fails(lambda: int(inf), "cannot convert.*infinity") assert.fails(lambda: int(nan), "cannot convert.*NaN") -# float conversion +# -- float() function -- assert.eq(float(), 0.0) +# float(bool) assert.eq(float(False), 0.0) assert.eq(float(True), 1.0) +# float(int) assert.eq(float(0), 0.0) assert.eq(float(1), 1.0) +assert.eq(float(123), 123.0) +assert.eq(float(123 * 1000000 * 1000000 * 1000000 * 1000000 * 1000000), 1.23e+32) +# float(float) assert.eq(float(1.1), 1.1) -assert.eq(float("1.1"), 1.1) -assert.fails(lambda: float("1.1abc"), "invalid syntax") -assert.fails(lambda: float("1e100.0"), "invalid syntax") -assert.fails(lambda: float("1e1000"), "out of range") assert.fails(lambda: float(None), "want number or string") +assert.ne(False, 0.0) # differs from Python +assert.ne(True, 1.0) +# float(string) +assert.eq(float("1.1"), 1.1) +assert.fails(lambda: float("1.1abc"), "invalid float literal") +assert.fails(lambda: float("1e100.0"), "invalid float literal") +assert.fails(lambda: float("1e1000"), "floating-point number too large") assert.eq(float("-1.1"), -1.1) assert.eq(float("+1.1"), +1.1) assert.eq(float("+Inf"), inf) assert.eq(float("-Inf"), neginf) -assert.true(isnan(float("NaN"))) -assert.fails(lambda: float("+NaN"), "invalid syntax") -assert.fails(lambda: float("-NaN"), "invalid syntax") +assert.eq(float("NaN"), nan) +assert.eq(float("NaN"), nan) +assert.eq(float("+NAN"), nan) +assert.eq(float("-nan"), nan) +assert.eq(str(float("Inf")), "+inf") +assert.eq(str(float("+INF")), "+inf") +assert.eq(str(float("-inf")), "-inf") +assert.eq(str(float("+InFiniTy")), "+inf") +assert.eq(str(float("-iNFiniTy")), "-inf") +assert.fails(lambda: float("one point two"), "invalid float literal: one point two") +assert.fails(lambda: float("1.2.3"), "invalid float literal: 1.2.3") +assert.fails(lambda: float(123 << 500 << 500 << 50), "int too large to convert to float") +assert.fails(lambda: float(-123 << 500 << 500 << 50), "int too large to convert to float") +assert.fails(lambda: float(str(-123 << 500 << 500 << 50)), "floating-point number too large") + +# -- implicit float(int) conversions -- +assert.fails(lambda: (1<<500<<500<<500) + 0.0, "int too large to convert to float") +assert.fails(lambda: 0.0 + (1<<500<<500<<500), "int too large to convert to float") +assert.fails(lambda: (1<<500<<500<<500) - 0.0, "int too large to convert to float") +assert.fails(lambda: 0.0 - (1<<500<<500<<500), "int too large to convert to float") +assert.fails(lambda: (1<<500<<500<<500) * 1.0, "int too large to convert to float") +assert.fails(lambda: 1.0 * (1<<500<<500<<500), "int too large to convert to float") +assert.fails(lambda: (1<<500<<500<<500) / 1.0, "int too large to convert to float") +assert.fails(lambda: 1.0 / (1<<500<<500<<500), "int too large to convert to float") +assert.fails(lambda: (1<<500<<500<<500) // 1.0, "int too large to convert to float") +assert.fails(lambda: 1.0 // (1<<500<<500<<500), "int too large to convert to float") +assert.fails(lambda: (1<<500<<500<<500) % 1.0, "int too large to convert to float") +assert.fails(lambda: 1.0 % (1<<500<<500<<500), "int too large to convert to float") + + +# -- int function -- +assert.eq(int(0.0), 0) +assert.eq(int(1.0), 1) +assert.eq(int(1.1), 1) +assert.eq(int(0.9), 0) +assert.eq(int(-1.1), -1.0) +assert.eq(int(-1.0), -1.0) +assert.eq(int(-0.9), 0.0) +assert.eq(int(1.23e+32), 123000000000000004979083645550592) +assert.eq(int(-1.23e-32), 0) +assert.eq(int(1.23e-32), 0) +assert.fails(lambda: int(float("+Inf")), "cannot convert float infinity to integer") +assert.fails(lambda: int(float("-Inf")), "cannot convert float infinity to integer") +assert.fails(lambda: int(float("NaN")), "cannot convert float NaN to integer") + # hash # Check that equal float and int values have the same internal hash. @@ -214,16 +390,67 @@ def checkhash(): checkhash() # string formatting -assert.eq("%s" % 123.45e67, "1.2345e+69") -assert.eq("%r" % 123.45e67, "1.2345e+69") -assert.eq("%e" % 123.45e67, "1.234500e+69") -assert.eq("%f" % 123.45e67, "1234500000000000033987094856609369647752433474509923447907937257783296.000000") -assert.eq("%g" % 123.45e67, "1.2345e+69") + +# %d +assert.eq("%d" % 0, "0") +assert.eq("%d" % 0.0, "0") +assert.eq("%d" % 123, "123") +assert.eq("%d" % 123.0, "123") +assert.eq("%d" % 1.23e45, "1229999999999999973814869011019624571608236032") +# (see below for '%d' % NaN/Inf) +assert.eq("%d" % negzero, "0") +assert.fails(lambda: "%d" % float("NaN"), "cannot convert float NaN to integer") +assert.fails(lambda: "%d" % float("+Inf"), "cannot convert float infinity to integer") +assert.fails(lambda: "%d" % float("-Inf"), "cannot convert float infinity to integer") + +# %e +assert.eq("%e" % 0, "0.000000e+00") +assert.eq("%e" % 0.0, "0.000000e+00") assert.eq("%e" % 123, "1.230000e+02") -assert.eq("%f" % 123, "123.000000") -assert.eq("%g" % 123, "123") +assert.eq("%e" % 123.0, "1.230000e+02") +assert.eq("%e" % 1.23e45, "1.230000e+45") +assert.eq("%e" % -1.23e-45, "-1.230000e-45") +assert.eq("%e" % nan, "nan") +assert.eq("%e" % inf, "+inf") +assert.eq("%e" % neginf, "-inf") +assert.eq("%e" % negzero, "-0.000000e+00") assert.fails(lambda: "%e" % "123", "requires float, not str") +# %f +assert.eq("%f" % 0, "0.000000") +assert.eq("%f" % 0.0, "0.000000") +assert.eq("%f" % 123, "123.000000") +assert.eq("%f" % 123.0, "123.000000") +# Note: Starlark/Java emits 1230000000000000000000000000000000000000000000.000000. Why? +assert.eq("%f" % 1.23e45, "1229999999999999973814869011019624571608236032.000000") +assert.eq("%f" % -1.23e-45, "-0.000000") +assert.eq("%f" % nan, "nan") +assert.eq("%f" % inf, "+inf") +assert.eq("%f" % neginf, "-inf") +assert.eq("%f" % negzero, "-0.000000") assert.fails(lambda: "%f" % "123", "requires float, not str") +# %g +assert.eq("%g" % 0, "0.0") +assert.eq("%g" % 0.0, "0.0") +assert.eq("%g" % 123, "123.0") +assert.eq("%g" % 123.0, "123.0") +assert.eq("%g" % 1.110, "1.11") +assert.eq("%g" % 1e5, "100000.0") +assert.eq("%g" % 1e6, "1e+06") # Note: threshold of scientific notation is 1e17 in Starlark/Java +assert.eq("%g" % 1.23e45, "1.23e+45") +assert.eq("%g" % -1.23e-45, "-1.23e-45") +assert.eq("%g" % nan, "nan") +assert.eq("%g" % inf, "+inf") +assert.eq("%g" % neginf, "-inf") +assert.eq("%g" % negzero, "-0.0") +# str uses %g +assert.eq(str(0.0), "0.0") +assert.eq(str(123.0), "123.0") +assert.eq(str(1.23e45), "1.23e+45") +assert.eq(str(-1.23e-45), "-1.23e-45") +assert.eq(str(nan), "nan") +assert.eq(str(inf), "+inf") +assert.eq(str(neginf), "-inf") +assert.eq(str(negzero), "-0.0") assert.fails(lambda: "%g" % "123", "requires float, not str") i0 = 1 diff --git a/starlark/testdata/int.star b/starlark/testdata/int.star index c987fd17..a2e67167 100644 --- a/starlark/testdata/int.star +++ b/starlark/testdata/int.star @@ -1,5 +1,4 @@ # Tests of Starlark 'int' -# option:float load("assert.star", "assert") @@ -21,72 +20,72 @@ assert.eq(minint64, -9223372036854775808) assert.eq(maxint32, 2147483647) assert.eq(minint32, -2147483648) - # truth def truth(): - assert.true(not 0) - for m in [1, maxint32]: # Test small/big ranges - assert.true(123*m) - assert.true(-1*m) + assert.true(not 0) + for m in [1, maxint32]: # Test small/big ranges + assert.true(123 * m) + assert.true(-1 * m) truth() # floored division # (For real division, see float.star.) def division(): - for m in [1, maxint32]: # Test small/big ranges - assert.eq((100*m) // (7*m), 14) - assert.eq((100*m) // (-7*m), -15) - assert.eq((-100*m) // (7*m), -15) # NB: different from Go/Java - assert.eq((-100*m) // (-7*m), 14) # NB: different from Go/Java - assert.eq((98*m) // (7*m), 14) - assert.eq((98*m) // (-7*m), -14) - assert.eq((-98*m) // (7*m), -14) - assert.eq((-98*m) // (-7*m), 14) + for m in [1, maxint32]: # Test small/big ranges + assert.eq((100 * m) // (7 * m), 14) + assert.eq((100 * m) // (-7 * m), -15) + assert.eq((-100 * m) // (7 * m), -15) # NB: different from Go/Java + assert.eq((-100 * m) // (-7 * m), 14) # NB: different from Go/Java + assert.eq((98 * m) // (7 * m), 14) + assert.eq((98 * m) // (-7 * m), -14) + assert.eq((-98 * m) // (7 * m), -14) + assert.eq((-98 * m) // (-7 * m), 14) division() # remainder def remainder(): - for m in [1, maxint32]: # Test small/big ranges - assert.eq((100*m) % (7*m), 2*m) - assert.eq((100*m) % (-7*m), -5*m) # NB: different from Go/Java - assert.eq((-100*m) % (7*m), 5*m) # NB: different from Go/Java - assert.eq((-100*m) % (-7*m), -2*m) - assert.eq((98*m) % (7*m), 0) - assert.eq((98*m) % (-7*m), 0) - assert.eq((-98*m) % (7*m), 0) - assert.eq((-98*m) % (-7*m), 0) + for m in [1, maxint32]: # Test small/big ranges + assert.eq((100 * m) % (7 * m), 2 * m) + assert.eq((100 * m) % (-7 * m), -5 * m) # NB: different from Go/Java + assert.eq((-100 * m) % (7 * m), 5 * m) # NB: different from Go/Java + assert.eq((-100 * m) % (-7 * m), -2 * m) + assert.eq((98 * m) % (7 * m), 0) + assert.eq((98 * m) % (-7 * m), 0) + assert.eq((-98 * m) % (7 * m), 0) + assert.eq((-98 * m) % (-7 * m), 0) remainder() # compound assignment def compound(): - x = 1 - x += 1 - assert.eq(x, 2) - x -= 3 - assert.eq(x, -1) - x *= 39 - assert.eq(x, -39) - x //= 4 - assert.eq(x, -10) - x /= -2 - assert.eq(x, 5) - x %= 3 - assert.eq(x, 2) - # use resolve.AllowBitwise to enable the ops: - x = 2 - x &= 1 - assert.eq(x, 0) - x |= 2 - assert.eq(x, 2) - x ^= 3 - assert.eq(x, 1) - x <<= 2 - assert.eq(x, 4) - x >>=2 - assert.eq(x, 1) + x = 1 + x += 1 + assert.eq(x, 2) + x -= 3 + assert.eq(x, -1) + x *= 39 + assert.eq(x, -39) + x //= 4 + assert.eq(x, -10) + x /= -2 + assert.eq(x, 5) + x %= 3 + assert.eq(x, 2) + + # use resolve.AllowBitwise to enable the ops: + x = 2 + x &= 1 + assert.eq(x, 0) + x |= 2 + assert.eq(x, 2) + x ^= 3 + assert.eq(x, 1) + x <<= 2 + assert.eq(x, 4) + x >>= 2 + assert.eq(x, 1) compound() @@ -94,56 +93,58 @@ compound() # See float.star for float-to-int conversions. # We follow Python 3 here, but I can't see the method in its madness. # int from bool/int/float -assert.fails(int, 'missing argument') # int() +assert.fails(int, "missing argument") # int() assert.eq(int(False), 0) assert.eq(int(True), 1) assert.eq(int(3), 3) assert.eq(int(3.1), 3) -assert.fails(lambda: int(3, base=10), "non-string with explicit base") +assert.fails(lambda: int(3, base = 10), "non-string with explicit base") assert.fails(lambda: int(True, 10), "non-string with explicit base") + # int from string, base implicitly 10 assert.eq(int("100000000000000000000"), 10000000000 * 10000000000) assert.eq(int("-100000000000000000000"), -10000000000 * 10000000000) assert.eq(int("123"), 123) assert.eq(int("-123"), -123) -assert.eq(int("0123"), 123) # not octal +assert.eq(int("0123"), 123) # not octal assert.eq(int("-0123"), -123) assert.fails(lambda: int("0x12"), "invalid literal with base 10") assert.fails(lambda: int("-0x12"), "invalid literal with base 10") assert.fails(lambda: int("0o123"), "invalid literal.*base 10") assert.fails(lambda: int("-0o123"), "invalid literal.*base 10") + # int from string, explicit base assert.eq(int("0"), 0) assert.eq(int("00"), 0) -assert.eq(int("0", base=10), 0) -assert.eq(int("00", base=10), 0) -assert.eq(int("0", base=8), 0) -assert.eq(int("00", base=8), 0) +assert.eq(int("0", base = 10), 0) +assert.eq(int("00", base = 10), 0) +assert.eq(int("0", base = 8), 0) +assert.eq(int("00", base = 8), 0) assert.eq(int("-0"), 0) assert.eq(int("-00"), 0) -assert.eq(int("-0", base=10), 0) -assert.eq(int("-00", base=10), 0) -assert.eq(int("-0", base=8), 0) -assert.eq(int("-00", base=8), 0) +assert.eq(int("-0", base = 10), 0) +assert.eq(int("-00", base = 10), 0) +assert.eq(int("-0", base = 8), 0) +assert.eq(int("-00", base = 8), 0) assert.eq(int("+0"), 0) assert.eq(int("+00"), 0) -assert.eq(int("+0", base=10), 0) -assert.eq(int("+00", base=10), 0) -assert.eq(int("+0", base=8), 0) -assert.eq(int("+00", base=8), 0) -assert.eq(int("11", base=9), 10) -assert.eq(int("-11", base=9), -10) -assert.eq(int("10011", base=2), 19) -assert.eq(int("-10011", base=2), -19) +assert.eq(int("+0", base = 10), 0) +assert.eq(int("+00", base = 10), 0) +assert.eq(int("+0", base = 8), 0) +assert.eq(int("+00", base = 8), 0) +assert.eq(int("11", base = 9), 10) +assert.eq(int("-11", base = 9), -10) +assert.eq(int("10011", base = 2), 19) +assert.eq(int("-10011", base = 2), -19) assert.eq(int("123", 8), 83) assert.eq(int("-123", 8), -83) -assert.eq(int("0123", 8), 83) # redundant zeros permitted +assert.eq(int("0123", 8), 83) # redundant zeros permitted assert.eq(int("-0123", 8), -83) assert.eq(int("00123", 8), 83) assert.eq(int("-00123", 8), -83) assert.eq(int("0o123", 8), 83) assert.eq(int("-0o123", 8), -83) -assert.eq(int("123", 7), 66) # 1*7*7 + 2*7 + 3 +assert.eq(int("123", 7), 66) # 1*7*7 + 2*7 + 3 assert.eq(int("-123", 7), -66) assert.eq(int("12", 16), 18) assert.eq(int("-12", 16), -18) @@ -160,6 +161,7 @@ assert.fails(lambda: int("-0x123", 8), "invalid literal.*base 8") assert.fails(lambda: int("0o123", 16), "invalid literal.*base 16") assert.fails(lambda: int("-0o123", 16), "invalid literal.*base 16") assert.fails(lambda: int("0x110", 2), "invalid literal.*base 2") + # int from string, auto detect base assert.eq(int("123", 0), 123) assert.eq(int("+123", 0), +123) @@ -170,10 +172,12 @@ assert.eq(int("-0x12", 0), -18) assert.eq(int("0o123", 0), 83) assert.eq(int("+0o123", 0), +83) assert.eq(int("-0o123", 0), -83) -assert.fails(lambda: int("0123", 0), "invalid literal.*base 0") # valid in Python 2.7 +assert.fails(lambda: int("0123", 0), "invalid literal.*base 0") # valid in Python 2.7 assert.fails(lambda: int("-0123", 0), "invalid literal.*base 0") + # github.com/google/starlark-go/issues/108 assert.fails(lambda: int("0Oxa", 8), "invalid literal with base 8: 0Oxa") + # follow-on bugs to issue 108 assert.fails(lambda: int("--4"), "invalid literal with base 10: --4") assert.fails(lambda: int("++4"), "invalid literal with base 10: \\+\\+4") @@ -185,14 +189,14 @@ assert.fails(lambda: int("0x-4", 16), "invalid literal with base 16: 0x-4") # use resolve.AllowBitwise to enable the ops. # TODO(adonovan): this is not yet in the Starlark spec, # but there is consensus that it should be. -assert.eq(1|2, 3) -assert.eq(3|6, 7) -assert.eq((1|2) & (2|4), 2) +assert.eq(1 | 2, 3) +assert.eq(3 | 6, 7) +assert.eq((1 | 2) & (2 | 4), 2) assert.eq(1 ^ 2, 3) assert.eq(2 ^ 2, 0) -assert.eq(1 | 0 ^ 1, 1) # check | and ^ operators precedence +assert.eq(1 | 0 ^ 1, 1) # check | and ^ operators precedence assert.eq(~1, -2) -assert.eq(~-2, 1) +assert.eq(~(-2), 1) assert.eq(~0, -1) assert.eq(1 << 2, 4) assert.eq(2 >> 1, 1) @@ -202,30 +206,30 @@ assert.fails(lambda: 1 << 512, "shift count too large") # comparisons # TODO(adonovan): test: < > == != etc def comparisons(): - for m in [1, maxint32/2, maxint32]: # Test small/big ranges - assert.lt(-2*m, -1*m) - assert.lt(-1*m, 0*m) - assert.lt(0*m, 1*m) - assert.lt(1*m, 2*m) - assert.true(2*m >= 2*m) - assert.true(2*m > 1*m) - assert.true(1*m >= 1*m) - assert.true(1*m > 0*m) - assert.true(0*m >= 0*m) - assert.true(0*m > -1*m) - assert.true(-1*m >= -1*m) - assert.true(-1*m > -2*m) + for m in [1, maxint32 / 2, maxint32]: # Test small/big ranges + assert.lt(-2 * m, -1 * m) + assert.lt(-1 * m, 0 * m) + assert.lt(0 * m, 1 * m) + assert.lt(1 * m, 2 * m) + assert.true(2 * m >= 2 * m) + assert.true(2 * m > 1 * m) + assert.true(1 * m >= 1 * m) + assert.true(1 * m > 0 * m) + assert.true(0 * m >= 0 * m) + assert.true(0 * m > -1 * m) + assert.true(-1 * m >= -1 * m) + assert.true(-1 * m > -2 * m) comparisons() # precision assert.eq(str(maxint64), "9223372036854775807") -assert.eq(str(maxint64+1), "9223372036854775808") +assert.eq(str(maxint64 + 1), "9223372036854775808") assert.eq(str(minint64), "-9223372036854775808") -assert.eq(str(minint64-1), "-9223372036854775809") +assert.eq(str(minint64 - 1), "-9223372036854775809") assert.eq(str(minint64 * minint64), "85070591730234615865843651857942052864") -assert.eq(str(maxint32+1), "2147483648") -assert.eq(str(minint32-1), "-2147483649") +assert.eq(str(maxint32 + 1), "2147483648") +assert.eq(str(minint32 - 1), "-2147483649") assert.eq(str(minint32 * minint32), "4611686018427387904") assert.eq(str(minint32 | maxint32), "-1") assert.eq(str(minint32 & minint32), "-2147483648") @@ -235,11 +239,11 @@ assert.eq(str(minint32 // -1), "2147483648") # string formatting assert.eq("%o %x %d" % (0o755, 0xDEADBEEF, 42), "755 deadbeef 42") nums = [-95, -1, 0, +1, +95] -assert.eq(' '.join(["%o" % x for x in nums]), "-137 -1 0 1 137") -assert.eq(' '.join(["%d" % x for x in nums]), "-95 -1 0 1 95") -assert.eq(' '.join(["%i" % x for x in nums]), "-95 -1 0 1 95") -assert.eq(' '.join(["%x" % x for x in nums]), "-5f -1 0 1 5f") -assert.eq(' '.join(["%X" % x for x in nums]), "-5F -1 0 1 5F") +assert.eq(" ".join(["%o" % x for x in nums]), "-137 -1 0 1 137") +assert.eq(" ".join(["%d" % x for x in nums]), "-95 -1 0 1 95") +assert.eq(" ".join(["%i" % x for x in nums]), "-95 -1 0 1 95") +assert.eq(" ".join(["%x" % x for x in nums]), "-5f -1 0 1 5f") +assert.eq(" ".join(["%X" % x for x in nums]), "-5F -1 0 1 5F") assert.eq("%o %x %d" % (123, 123, 123), "173 7b 123") -assert.eq("%o %x %d" % (123.1, 123.1, 123.1), "173 7b 123") # non-int operands are acceptable +assert.eq("%o %x %d" % (123.1, 123.1, 123.1), "173 7b 123") # non-int operands are acceptable assert.fails(lambda: "%d" % True, "cannot convert bool to int") diff --git a/starlark/testdata/json.star b/starlark/testdata/json.star index 615d70bf..37c90704 100644 --- a/starlark/testdata/json.star +++ b/starlark/testdata/json.star @@ -1,5 +1,4 @@ # Tests of json module. -# option:float load("assert.star", "assert") load("json.star", "json") @@ -28,7 +27,7 @@ assert.eq(json.encode("\x80"), '"\\ufffd"') # invalid UTF-8 -> replacement char def encode_error(expr, error): assert.fails(lambda: json.encode(expr), error) -encode_error(float("NaN"), "json.encode: cannot encode non-finite float NaN") +encode_error(float("NaN"), "json.encode: cannot encode non-finite float nan") encode_error({1: "two"}, "dict has int key, want string") encode_error(len, "cannot encode builtin_function_or_method as JSON") encode_error(struct(x=[1, {"x": len}]), # nested failure diff --git a/starlark/testdata/misc.star b/starlark/testdata/misc.star index 0cb973ab..84ef84c1 100644 --- a/starlark/testdata/misc.star +++ b/starlark/testdata/misc.star @@ -36,8 +36,6 @@ # tuple slice # interpolate with %c, %% -# option:float - load("assert.star", "assert") # Ordered comparisons require values of the same type. diff --git a/starlark/testdata/string.star b/starlark/testdata/string.star index 1d78dd7b..859f6458 100644 --- a/starlark/testdata/string.star +++ b/starlark/testdata/string.star @@ -1,10 +1,10 @@ # Tests of Starlark 'string' -# option:float option:set +# option:set load("assert.star", "assert") # raw string literals: -assert.eq(r'a\bc', "a\\bc") +assert.eq(r"a\bc", "a\\bc") # truth assert.true("abc") @@ -12,7 +12,7 @@ assert.true(chr(0)) assert.true(not "") # str + str -assert.eq("a"+"b"+"c", "abc") +assert.eq("a" + "b" + "c", "abc") # str * int, int * str assert.eq("abc" * 0, "") @@ -24,26 +24,26 @@ assert.eq(-1 * "abc", "") assert.eq(1 * "abc", "abc") assert.eq(5 * "abc", "abcabcabcabcabc") assert.fails(lambda: 1.0 * "abc", "unknown.*float \\* str") -assert.fails(lambda : "abc" * (1000000 * 1000000), "repeat count 1000000000000 too large") -assert.fails(lambda : "abc" * 1000000 * 1000000, "excessive repeat \\(3000000 \\* 1000000 elements") +assert.fails(lambda: "abc" * (1000000 * 1000000), "repeat count 1000000000000 too large") +assert.fails(lambda: "abc" * 1000000 * 1000000, "excessive repeat \\(3000000 \\* 1000000 elements") # len assert.eq(len("Hello, 世界!"), 14) -assert.eq(len("𐐷"), 4) # U+10437 has a 4-byte UTF-8 encoding (and a 2-code UTF-16 encoding) +assert.eq(len("𐐷"), 4) # U+10437 has a 4-byte UTF-8 encoding (and a 2-code UTF-16 encoding) # chr & ord -assert.eq(chr(65), "A") # 1-byte UTF-8 encoding -assert.eq(chr(1049), "Й") # 2-byte UTF-8 encoding -assert.eq(chr(0x1F63F), "😿") # 4-byte UTF-8 encoding +assert.eq(chr(65), "A") # 1-byte UTF-8 encoding +assert.eq(chr(1049), "Й") # 2-byte UTF-8 encoding +assert.eq(chr(0x1F63F), "😿") # 4-byte UTF-8 encoding assert.fails(lambda: chr(-1), "Unicode code point -1 out of range \\(<0\\)") assert.fails(lambda: chr(0x110000), "Unicode code point U\\+110000 out of range \\(>0x10FFFF\\)") assert.eq(ord("A"), 65) assert.eq(ord("Й"), 1049) assert.eq(ord("😿"), 0x1F63F) -assert.eq(ord("Й"[1:]), 0xFFFD) # = Unicode replacement character +assert.eq(ord("Й"[1:]), 0xFFFD) # = Unicode replacement character assert.fails(lambda: ord("abc"), "string encodes 3 Unicode code points, want 1") assert.fails(lambda: ord(""), "string encodes 0 Unicode code points, want 1") -assert.fails(lambda: ord("😿"[1:]), "string encodes 3 Unicode code points, want 1") # 3 x 0xFFFD +assert.fails(lambda: ord("😿"[1:]), "string encodes 3 Unicode code points, want 1") # 3 x 0xFFFD # string.codepoint_ords assert.eq(type("abcЙ😿".codepoint_ords()), "codepoints") @@ -62,17 +62,21 @@ assert.eq(list("".codepoints()), []) # string.elem_ords assert.eq(type("abcЙ😿".elem_ords()), "elems") assert.eq(str("abcЙ😿".elem_ords()), '"abcЙ😿".elem_ords()') -assert.eq(list("abcЙ😿".elem_ords()), [97, 98, 99, 208, 153, 240, 159, 152, 191]) -assert.eq(list(("A" + "😿Z"[1:]).elem_ords()), [65, 159, 152, 191, 90]) +assert.eq(list("abcЙ😿".elem_ords()), [97, 98, 99, 208, 153, 240, 159, 152, 191]) +assert.eq(list(("A" + "😿Z"[1:]).elem_ords()), [65, 159, 152, 191, 90]) assert.eq(list("".elem_ords()), []) # string.elems assert.eq(type("abcЙ😿".elems()), "elems") assert.eq(str("abcЙ😿".elems()), '"abcЙ😿".elems()') -assert.eq(list("abcЙ😿".elems()), - ["a", "b", "c", "\xd0", "\x99", "\xf0", "\x9f", "\x98", "\xbf"]) -assert.eq(list(("A" + "😿Z"[1:]).elems()), - ["A", "\x9f", "\x98", "\xbf", "Z"]) +assert.eq( + list("abcЙ😿".elems()), + ["a", "b", "c", "\xd0", "\x99", "\xf0", "\x9f", "\x98", "\xbf"], +) +assert.eq( + list(("A" + "😿Z"[1:]).elems()), + ["A", "\x9f", "\x98", "\xbf", "Z"], +) assert.eq(list("".elems()), []) # indexing, x[i] @@ -90,7 +94,10 @@ assert.fails(lambda: "abc"[4], "out of range") # x[i] = ... x2 = "abc" -def f(): x2[1] = 'B' + +def f(): + x2[1] = "B" + assert.fails(f, "string.*does not support.*assignment") # slicing, x[i:j] @@ -115,6 +122,7 @@ assert.eq("abc"[:3], "abc") assert.eq("abc"[:4], "abc") assert.eq("abc"[1:2], "b") assert.eq("abc"[2:1], "") + # non-unit strides assert.eq("abcd"[0:4:1], "abcd") assert.eq("abcd"[::2], "ac") @@ -139,7 +147,7 @@ assert.fails(lambda: 1 in "", "requires string as left operand") assert.fails(lambda: "" in 1, "unknown binary op: string in int") # ==, != -assert.eq("hello", "he"+"llo") +assert.eq("hello", "he" + "llo") assert.ne("hello", "Hello") # hash must follow java.lang.String.hashCode. @@ -157,12 +165,13 @@ assert.eq(gothash, wanthash) # string % tuple formatting assert.eq("A %d %x Z" % (123, 456), "A 123 1c8 Z") -assert.eq("A %(foo)d %(bar)s Z" % {"foo": 123, "bar":"hi"}, "A 123 hi Z") -assert.eq("%s %r" % ("hi", "hi"), 'hi "hi"') # TODO(adonovan): use ''-quotation +assert.eq("A %(foo)d %(bar)s Z" % {"foo": 123, "bar": "hi"}, "A 123 hi Z") +assert.eq("%s %r" % ("hi", "hi"), 'hi "hi"') # TODO(adonovan): use ''-quotation assert.eq("%%d %d" % 1, "%d 1") assert.fails(lambda: "%d %d" % 1, "not enough arguments for format string") assert.fails(lambda: "%d %d" % (1, 2, 3), "too many arguments for format string") assert.fails(lambda: "" % 1, "too many arguments for format string") + # %c assert.eq("%c" % 65, "A") assert.eq("%c" % 0x3b1, "α") @@ -181,31 +190,31 @@ assert.eq("a{}b{}c{}d{}".format(1, 2, 3, 4), "a1b2c3d4") assert.eq("a{{b".format(), "a{b") assert.eq("a}}b".format(), "a}b") assert.eq("a{{b}}c".format(), "a{b}c") -assert.eq("a{x}b{y}c{}".format(1, x=2, y=3), "a2b3c1") -assert.fails(lambda: "a{z}b".format(x=1), "keyword z not found") +assert.eq("a{x}b{y}c{}".format(1, x = 2, y = 3), "a2b3c1") +assert.fails(lambda: "a{z}b".format(x = 1), "keyword z not found") assert.fails(lambda: "{-1}".format(1), "keyword -1 not found") assert.fails(lambda: "{-0}".format(1), "keyword -0 not found") assert.fails(lambda: "{+0}".format(1), "keyword \\+0 not found") -assert.fails(lambda: "{+1}".format(1), "keyword \\+1 not found") # starlark-go/issues/114 +assert.fails(lambda: "{+1}".format(1), "keyword \\+1 not found") # starlark-go/issues/114 assert.eq("{0000000000001}".format(0, 1), "1") -assert.eq("{012}".format(*range(100)), "12") # decimal, despite leading zeros -assert.fails(lambda: '{0,1} and {1}'.format(1, 2), "keyword 0,1 not found") +assert.eq("{012}".format(*range(100)), "12") # decimal, despite leading zeros +assert.fails(lambda: "{0,1} and {1}".format(1, 2), "keyword 0,1 not found") assert.fails(lambda: "a{123}b".format(), "tuple index out of range") assert.fails(lambda: "a{}b{}c".format(1), "tuple index out of range") -assert.eq("a{010}b".format(0,1,2,3,4,5,6,7,8,9,10), "a10b") # index is decimal +assert.eq("a{010}b".format(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10), "a10b") # index is decimal assert.fails(lambda: "a{}b{1}c".format(1, 2), "cannot switch from automatic field numbering to manual") assert.eq("a{!s}c".format("b"), "abc") assert.eq("a{!r}c".format("b"), r'a"b"c') -assert.eq("a{x!r}c".format(x='b'), r'a"b"c') -assert.fails(lambda: "{x!}".format(x=1), "unknown conversion") -assert.fails(lambda: "{x!:}".format(x=1), "unknown conversion") -assert.fails(lambda: '{a.b}'.format(1), "syntax x.y is not supported") -assert.fails(lambda: '{a[0]}'.format(1), "syntax a\\[i\\] is not supported") -assert.fails(lambda: '{ {} }'.format(1), "nested replacement fields not supported") -assert.fails(lambda: '{{}'.format(1), "single '}' in format") -assert.fails(lambda: '{}}'.format(1), "single '}' in format") -assert.fails(lambda: '}}{'.format(1), "unmatched '{' in format") -assert.fails(lambda: '}{{'.format(1), "single '}' in format") +assert.eq("a{x!r}c".format(x = "b"), r'a"b"c') +assert.fails(lambda: "{x!}".format(x = 1), "unknown conversion") +assert.fails(lambda: "{x!:}".format(x = 1), "unknown conversion") +assert.fails(lambda: "{a.b}".format(1), "syntax x.y is not supported") +assert.fails(lambda: "{a[0]}".format(1), "syntax a\\[i\\] is not supported") +assert.fails(lambda: "{ {} }".format(1), "nested replacement fields not supported") +assert.fails(lambda: "{{}".format(1), "single '}' in format") +assert.fails(lambda: "{}}".format(1), "single '}' in format") +assert.fails(lambda: "}}{".format(1), "unmatched '{' in format") +assert.fails(lambda: "}{{".format(1), "single '}' in format") # str.split, str.rsplit assert.eq("a.b.c.d".split("."), ["a", "b", "c", "d"]) @@ -242,44 +251,46 @@ assert.eq(" a bc\n def \t ghi ".split(None, 1), ["a", "bc\n def \t ghi "]) assert.eq(" a bc\n def \t ghi ".rsplit(None, 1), [" a bc\n def", "ghi"]) # Observe the algorithmic difference when splitting on spaces versus other delimiters. -assert.eq('--aa--bb--cc--'.split('-', 0), ['--aa--bb--cc--']) # contrast this -assert.eq(' aa bb cc '.split(None, 0), ['aa bb cc ']) # with this -assert.eq('--aa--bb--cc--'.rsplit('-', 0), ['--aa--bb--cc--']) # ditto this -assert.eq(' aa bb cc '.rsplit(None, 0), [' aa bb cc']) # and this +assert.eq("--aa--bb--cc--".split("-", 0), ["--aa--bb--cc--"]) # contrast this +assert.eq(" aa bb cc ".split(None, 0), ["aa bb cc "]) # with this +assert.eq("--aa--bb--cc--".rsplit("-", 0), ["--aa--bb--cc--"]) # ditto this +assert.eq(" aa bb cc ".rsplit(None, 0), [" aa bb cc"]) # and this + # -assert.eq('--aa--bb--cc--'.split('-', 1), ['', '-aa--bb--cc--']) -assert.eq('--aa--bb--cc--'.rsplit('-', 1), ['--aa--bb--cc-', '']) -assert.eq(' aa bb cc '.split(None, 1), ['aa', 'bb cc ']) -assert.eq(' aa bb cc '.rsplit(None, 1), [' aa bb', 'cc']) +assert.eq("--aa--bb--cc--".split("-", 1), ["", "-aa--bb--cc--"]) +assert.eq("--aa--bb--cc--".rsplit("-", 1), ["--aa--bb--cc-", ""]) +assert.eq(" aa bb cc ".split(None, 1), ["aa", "bb cc "]) +assert.eq(" aa bb cc ".rsplit(None, 1), [" aa bb", "cc"]) + # -assert.eq('--aa--bb--cc--'.split('-', -1), ['', '', 'aa', '', 'bb', '', 'cc', '', '']) -assert.eq('--aa--bb--cc--'.rsplit('-', -1), ['', '', 'aa', '', 'bb', '', 'cc', '', '']) -assert.eq(' aa bb cc '.split(None, -1), ['aa', 'bb', 'cc']) -assert.eq(' aa bb cc '.rsplit(None, -1), ['aa', 'bb', 'cc']) -assert.eq(' '.split(None), []) -assert.eq(' '.rsplit(None), []) +assert.eq("--aa--bb--cc--".split("-", -1), ["", "", "aa", "", "bb", "", "cc", "", ""]) +assert.eq("--aa--bb--cc--".rsplit("-", -1), ["", "", "aa", "", "bb", "", "cc", "", ""]) +assert.eq(" aa bb cc ".split(None, -1), ["aa", "bb", "cc"]) +assert.eq(" aa bb cc ".rsplit(None, -1), ["aa", "bb", "cc"]) +assert.eq(" ".split(None), []) +assert.eq(" ".rsplit(None), []) assert.eq("localhost:80".rsplit(":", 1)[-1], "80") # str.splitlines -assert.eq('\nabc\ndef'.splitlines(), ['', 'abc', 'def']) -assert.eq('\nabc\ndef'.splitlines(True), ['\n', 'abc\n', 'def']) -assert.eq('\nabc\ndef\n'.splitlines(), ['', 'abc', 'def']) -assert.eq('\nabc\ndef\n'.splitlines(True), ['\n', 'abc\n', 'def\n']) -assert.eq(''.splitlines(), []) # -assert.eq(''.splitlines(True), []) # -assert.eq('a'.splitlines(), ['a']) -assert.eq('a'.splitlines(True), ['a']) -assert.eq('\n'.splitlines(), ['']) -assert.eq('\n'.splitlines(True), ['\n']) -assert.eq('a\n'.splitlines(), ['a']) -assert.eq('a\n'.splitlines(True), ['a\n']) -assert.eq('a\n\nb'.splitlines(), ['a', '', 'b']) -assert.eq('a\n\nb'.splitlines(True), ['a\n', '\n', 'b']) -assert.eq('a\nb\nc'.splitlines(), ['a', 'b', 'c']) -assert.eq('a\nb\nc'.splitlines(True), ['a\n', 'b\n', 'c']) -assert.eq('a\nb\nc\n'.splitlines(), ['a', 'b', 'c']) -assert.eq('a\nb\nc\n'.splitlines(True), ['a\n', 'b\n', 'c\n']) +assert.eq("\nabc\ndef".splitlines(), ["", "abc", "def"]) +assert.eq("\nabc\ndef".splitlines(True), ["\n", "abc\n", "def"]) +assert.eq("\nabc\ndef\n".splitlines(), ["", "abc", "def"]) +assert.eq("\nabc\ndef\n".splitlines(True), ["\n", "abc\n", "def\n"]) +assert.eq("".splitlines(), []) # +assert.eq("".splitlines(True), []) # +assert.eq("a".splitlines(), ["a"]) +assert.eq("a".splitlines(True), ["a"]) +assert.eq("\n".splitlines(), [""]) +assert.eq("\n".splitlines(True), ["\n"]) +assert.eq("a\n".splitlines(), ["a"]) +assert.eq("a\n".splitlines(True), ["a\n"]) +assert.eq("a\n\nb".splitlines(), ["a", "", "b"]) +assert.eq("a\n\nb".splitlines(True), ["a\n", "\n", "b"]) +assert.eq("a\nb\nc".splitlines(), ["a", "b", "c"]) +assert.eq("a\nb\nc".splitlines(True), ["a\n", "b\n", "c"]) +assert.eq("a\nb\nc\n".splitlines(), ["a", "b", "c"]) +assert.eq("a\nb\nc\n".splitlines(True), ["a\n", "b\n", "c\n"]) # str.{,l,r}strip assert.eq(" \tfoo\n ".strip(), "foo") @@ -305,23 +316,26 @@ assert.true(not "foo".endswith("x")) assert.true("foo".startswith("fo")) assert.true(not "foo".startswith("x")) assert.fails(lambda: "foo".startswith(1), "got int.*want string") + # -assert.true('abc'.startswith(('a', 'A'))) -assert.true('ABC'.startswith(('a', 'A'))) -assert.true(not 'ABC'.startswith(('b', 'B'))) -assert.fails(lambda: '123'.startswith((1, 2)), 'got int, for element 0') -assert.fails(lambda: '123'.startswith(['3']), 'got list') +assert.true("abc".startswith(("a", "A"))) +assert.true("ABC".startswith(("a", "A"))) +assert.true(not "ABC".startswith(("b", "B"))) +assert.fails(lambda: "123".startswith((1, 2)), "got int, for element 0") +assert.fails(lambda: "123".startswith(["3"]), "got list") + # -assert.true('abc'.endswith(('c', 'C'))) -assert.true('ABC'.endswith(('c', 'C'))) -assert.true(not 'ABC'.endswith(('b', 'B'))) -assert.fails(lambda: '123'.endswith((1, 2)), 'got int, for element 0') -assert.fails(lambda: '123'.endswith(['3']), 'got list') +assert.true("abc".endswith(("c", "C"))) +assert.true("ABC".endswith(("c", "C"))) +assert.true(not "ABC".endswith(("b", "B"))) +assert.fails(lambda: "123".endswith((1, 2)), "got int, for element 0") +assert.fails(lambda: "123".endswith(["3"]), "got list") + # start/end -assert.true('abc'.startswith('bc', 1)) -assert.true(not 'abc'.startswith('b', 999)) -assert.true('abc'.endswith('ab', None, -1)) -assert.true(not 'abc'.endswith('b', None, -999)) +assert.true("abc".startswith("bc", 1)) +assert.true(not "abc".startswith("b", 999)) +assert.true("abc".endswith("ab", None, -1)) +assert.true(not "abc".endswith("b", None, -999)) # str.replace assert.eq("banana".replace("a", "o", 1), "bonana") @@ -346,71 +360,77 @@ assert.eq("foo/bar/wiz".rpartition("."), ("", "", "foo/bar/wiz")) assert.fails(lambda: "foo/bar/wiz".partition(""), "empty separator") assert.fails(lambda: "foo/bar/wiz".rpartition(""), "empty separator") -assert.eq('?'.join(["foo", "a/b/c.go".rpartition("/")[0]]), 'foo?a/b') +assert.eq("?".join(["foo", "a/b/c.go".rpartition("/")[0]]), "foo?a/b") # str.is{alpha,...} def test_predicates(): - predicates = ["alnum", "alpha", "digit", "lower", "space", "title", "upper"] - table = { - "Hello, World!": "title", - "hello, world!": "lower", - "base64": "alnum lower", - "HAL-9000": "upper", - "Catch-22": "title", - "": "", - "\n\t\r": "space", - "abc": "alnum alpha lower", - "ABC": "alnum alpha upper", - "123": "alnum digit", - "DŽLJ": "alnum alpha upper", - "DžLj": "alnum alpha", - "Dž Lj": "title", - "džlj": "alnum alpha lower", - } - for str, want in table.items(): - got = ' '.join([name for name in predicates if getattr(str, "is"+name)()]) - if got != want: - assert.fail("%r matched [%s], want [%s]" % (str, got, want)) + predicates = ["alnum", "alpha", "digit", "lower", "space", "title", "upper"] + table = { + "Hello, World!": "title", + "hello, world!": "lower", + "base64": "alnum lower", + "HAL-9000": "upper", + "Catch-22": "title", + "": "", + "\n\t\r": "space", + "abc": "alnum alpha lower", + "ABC": "alnum alpha upper", + "123": "alnum digit", + "DŽLJ": "alnum alpha upper", + "DžLj": "alnum alpha", + "Dž Lj": "title", + "džlj": "alnum alpha lower", + } + for str, want in table.items(): + got = " ".join([name for name in predicates if getattr(str, "is" + name)()]) + if got != want: + assert.fail("%r matched [%s], want [%s]" % (str, got, want)) + test_predicates() # Strings are not iterable. # ok -assert.eq(len("abc"), 3) # len -assert.true("a" in "abc") # str in str -assert.eq("abc"[1], "b") # indexing +assert.eq(len("abc"), 3) # len +assert.true("a" in "abc") # str in str +assert.eq("abc"[1], "b") # indexing + # not ok def for_string(): - for x in "abc": - pass -def args(*args): return args -assert.fails(lambda: args(*"abc"), "must be iterable, not string") # varargs -assert.fails(lambda: list("abc"), "got string, want iterable") # list(str) -assert.fails(lambda: tuple("abc"), "got string, want iterable") # tuple(str) -assert.fails(lambda: set("abc"), "got string, want iterable") # set(str) + for x in "abc": + pass + +def args(*args): + return args + +assert.fails(lambda: args(*"abc"), "must be iterable, not string") # varargs +assert.fails(lambda: list("abc"), "got string, want iterable") # list(str) +assert.fails(lambda: tuple("abc"), "got string, want iterable") # tuple(str) +assert.fails(lambda: set("abc"), "got string, want iterable") # set(str) assert.fails(lambda: set() | "abc", "unknown binary op: set | string") # set union -assert.fails(lambda: enumerate("ab"), "got string, want iterable") # enumerate -assert.fails(lambda: sorted("abc"), "got string, want iterable") # sorted -assert.fails(lambda: [].extend("bc"), "got string, want iterable") # list.extend -assert.fails(lambda: ",".join("abc"), "got string, want iterable") # string.join -assert.fails(lambda: dict(["ab"]), "not iterable .*string") # dict +assert.fails(lambda: enumerate("ab"), "got string, want iterable") # enumerate +assert.fails(lambda: sorted("abc"), "got string, want iterable") # sorted +assert.fails(lambda: [].extend("bc"), "got string, want iterable") # list.extend +assert.fails(lambda: ",".join("abc"), "got string, want iterable") # string.join +assert.fails(lambda: dict(["ab"]), "not iterable .*string") # dict + # The Java implementation does not correctly reject the following cases: # (See Google Issue b/34385336) -assert.fails(for_string, "string value is not iterable") # for loop -assert.fails(lambda: [x for x in "abc"], "string value is not iterable") # comprehension -assert.fails(lambda: all("abc"), "got string, want iterable") # all -assert.fails(lambda: any("abc"), "got string, want iterable") # any -assert.fails(lambda: reversed("abc"), "got string, want iterable") # reversed -assert.fails(lambda: zip("ab", "cd"), "not iterable: string") # zip +assert.fails(for_string, "string value is not iterable") # for loop +assert.fails(lambda: [x for x in "abc"], "string value is not iterable") # comprehension +assert.fails(lambda: all("abc"), "got string, want iterable") # all +assert.fails(lambda: any("abc"), "got string, want iterable") # any +assert.fails(lambda: reversed("abc"), "got string, want iterable") # reversed +assert.fails(lambda: zip("ab", "cd"), "not iterable: string") # zip # str.join -assert.eq(','.join([]), '') -assert.eq(','.join(["a"]), 'a') -assert.eq(','.join(["a", "b"]), 'a,b') -assert.eq(','.join(["a", "b", "c"]), 'a,b,c') -assert.eq(','.join(("a", "b", "c")), 'a,b,c') -assert.eq(''.join(("a", "b", "c")), 'abc') -assert.fails(lambda: ''.join(None), 'got NoneType, want iterable') -assert.fails(lambda: ''.join(["one", 2]), 'join: in list, want string, got int') +assert.eq(",".join([]), "") +assert.eq(",".join(["a"]), "a") +assert.eq(",".join(["a", "b"]), "a,b") +assert.eq(",".join(["a", "b", "c"]), "a,b,c") +assert.eq(",".join(("a", "b", "c")), "a,b,c") +assert.eq("".join(("a", "b", "c")), "abc") +assert.fails(lambda: "".join(None), "got NoneType, want iterable") +assert.fails(lambda: "".join(["one", 2]), "join: in list, want string, got int") # TODO(adonovan): tests for: {,r}index diff --git a/starlark/value.go b/starlark/value.go index eb0e84e9..dc8f9116 100644 --- a/starlark/value.go +++ b/starlark/value.go @@ -385,10 +385,47 @@ func (x Bool) CompareSameType(op syntax.Token, y_ Value, depth int) (bool, error // Float is the type of a Starlark float. type Float float64 -func (f Float) String() string { return strconv.FormatFloat(float64(f), 'g', 6, 64) } -func (f Float) Type() string { return "float" } -func (f Float) Freeze() {} // immutable -func (f Float) Truth() Bool { return f != 0.0 } +func (f Float) String() string { + var buf strings.Builder + f.format(&buf, 'g') + return buf.String() +} + +func (f Float) format(buf *strings.Builder, conv byte) { + ff := float64(f) + if !isFinite(ff) { + if math.IsInf(ff, +1) { + buf.WriteString("+inf") + } else if math.IsInf(ff, -1) { + buf.WriteString("-inf") + } else { + buf.WriteString("nan") + } + return + } + + // %g is the default format used by str. + // It uses the minumum precision to avoid ambiguity, + // and always includes a '.' or an 'e' so that the value + // is self-evidently a float, not an int. + if conv == 'g' || conv == 'G' { + s := strconv.FormatFloat(ff, conv, -1, 64) + buf.WriteString(s) + // Ensure result always has a decimal point if no exponent. + // "123" -> "123.0" + if strings.IndexByte(s, conv-'g'+'e') < 0 && strings.IndexByte(s, '.') < 0 { + buf.WriteString(".0") + } + return + } + + // %[eEfF] use 6-digit precision + buf.WriteString(strconv.FormatFloat(ff, conv, 6, 64)) +} + +func (f Float) Type() string { return "float" } +func (f Float) Freeze() {} // immutable +func (f Float) Truth() Bool { return f != 0.0 } func (f Float) Hash() (uint32, error) { // Equal float and int values must yield the same hash. // TODO(adonovan): opt: if f is non-integral, and thus not equal @@ -409,27 +446,34 @@ func isFinite(f float64) bool { func (x Float) CompareSameType(op syntax.Token, y_ Value, depth int) (bool, error) { y := y_.(Float) - switch op { - case syntax.EQL: - return x == y, nil - case syntax.NEQ: - return x != y, nil - case syntax.LE: - return x <= y, nil - case syntax.LT: - return x < y, nil - case syntax.GE: - return x >= y, nil - case syntax.GT: - return x > y, nil + return threeway(op, floatCmp(x, y)), nil +} + +// floatCmp performs a three-valued comparison on floats, +// which are totally ordered with NaN > +Inf. +func floatCmp(x, y Float) int { + if x > y { + return +1 + } else if x < y { + return -1 + } else if x == y { + return 0 } - panic(op) + + // At least one operand is NaN. + if x == x { + return -1 // y is NaN + } else if y == y { + return +1 // x is NaN + } + return 0 // both NaN } func (f Float) rational() *big.Rat { return new(big.Rat).SetFloat64(float64(f)) } // AsFloat returns the float64 value closest to x. -// The f result is undefined if x is not a float or int. +// The f result is undefined if x is not a float or Int. +// The result may be infinite if x is a very large Int. func AsFloat(x Value) (f float64, ok bool) { switch x := x.(type) { case Float: @@ -1199,11 +1243,10 @@ func CompareDepth(op syntax.Token, x, y Value, depth int) (bool, error) { switch x := x.(type) { case Int: if y, ok := y.(Float); ok { - if y != y { - return false, nil // y is NaN - } var cmp int - if !math.IsInf(float64(y), 0) { + if y != y { + cmp = -1 // y is NaN + } else if !math.IsInf(float64(y), 0) { cmp = x.rational().Cmp(y.rational()) // y is finite } else if y > 0 { cmp = -1 // y is +Inf @@ -1214,16 +1257,15 @@ func CompareDepth(op syntax.Token, x, y Value, depth int) (bool, error) { } case Float: if y, ok := y.(Int); ok { - if x != x { - return false, nil // x is NaN - } var cmp int - if !math.IsInf(float64(x), 0) { + if x != x { + cmp = +1 // x is NaN + } else if !math.IsInf(float64(x), 0) { cmp = x.rational().Cmp(y.rational()) // x is finite } else if x > 0 { - cmp = -1 // x is +Inf + cmp = +1 // x is +Inf } else { - cmp = +1 // x is -Inf + cmp = -1 // x is -Inf } return threeway(op, cmp), nil } diff --git a/starlarkstruct/struct_test.go b/starlarkstruct/struct_test.go index 8e6a93df..5de7020e 100644 --- a/starlarkstruct/struct_test.go +++ b/starlarkstruct/struct_test.go @@ -19,7 +19,6 @@ func init() { // The tests make extensive use of these not-yet-standard features. resolve.AllowLambda = true resolve.AllowNestedDef = true - resolve.AllowFloat = true resolve.AllowSet = true }