diff --git a/Makefile b/Makefile index d4dc514f18..10a6de84eb 100644 --- a/Makefile +++ b/Makefile @@ -210,6 +210,7 @@ rpc-format: rpc-check: rpc @$(call print, "Verifying protos.") + for rpc in $$(find lnrpc/ -name "*.proto" | $(XARGS) awk '/ rpc /{print $$2}'); do if ! grep -q $$rpc lnrpc/rest-annotations.yaml; then echo "RPC $$rpc not added to lnrpc/rest-annotations.yaml"; exit 1; fi; done if test -n "$$(git describe --dirty | grep dirty)"; then echo "Protos not properly formatted or not compiled with v3.4.0"; git status; git diff; exit 1; fi mobile-rpc: diff --git a/go.mod b/go.mod index d121721ba3..fb49c5771f 100644 --- a/go.mod +++ b/go.mod @@ -24,12 +24,12 @@ require ( github.com/go-errors/errors v1.0.1 github.com/go-openapi/strfmt v0.19.5 // indirect github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect - github.com/golang/protobuf v1.3.1 + github.com/golang/protobuf v1.3.2 github.com/google/btree v1.0.0 // indirect github.com/gorilla/websocket v1.4.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 - github.com/grpc-ecosystem/grpc-gateway v1.8.6 + github.com/grpc-ecosystem/grpc-gateway v1.14.3 github.com/jackpal/gateway v1.0.5 github.com/jackpal/go-nat-pmp v0.0.0-20170405195558-28a68d0c24ad github.com/jedib0t/go-pretty v4.3.0+incompatible @@ -57,7 +57,6 @@ require ( github.com/miekg/dns v0.0.0-20171125082028-79bfde677fa8 github.com/modern-go/reflect2 v1.0.1 // indirect github.com/prometheus/client_golang v0.9.3 - github.com/rogpeppe/fastuuid v1.2.0 // indirect github.com/soheilhy/cmux v0.1.4 // indirect github.com/stretchr/testify v1.5.1 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect @@ -66,11 +65,11 @@ require ( github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect go.uber.org/zap v1.14.1 // indirect golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 - golang.org/x/net v0.0.0-20190620200207-3b0461eec859 + golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 golang.org/x/sys v0.0.0-20200116001909-b77594299b42 // indirect golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2 - google.golang.org/genproto v0.0.0-20190201180003-4b09977fb922 - google.golang.org/grpc v1.19.0 + google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c + google.golang.org/grpc v1.24.0 gopkg.in/errgo.v1 v1.0.1 // indirect gopkg.in/macaroon-bakery.v2 v2.0.1 gopkg.in/macaroon.v2 v2.0.0 diff --git a/go.sum b/go.sum index 3d28839918..18372a4ff8 100644 --- a/go.sum +++ b/go.sum @@ -16,6 +16,7 @@ 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/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -111,10 +112,12 @@ github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4er 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/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 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= 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 h1:q3pnF5JFBNRz8sRD+IRj7Y6DMyYGTNqnZ9axTbSfoNI= github.com/google/go-cmp v0.2.1-0.20190312032427-6f77996f0c42/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= @@ -131,8 +134,8 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.0 h1:Iju5GlWwrvL6UBg4zJJt3btmo github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.8.6 h1:XvND7+MPP7Jp+JpqSZ7naSl5nVZf6k0LbL1V3EKh0zc= -github.com/grpc-ecosystem/grpc-gateway v1.8.6/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.14.3 h1:OCJlWkOUoTnl0neNGlf4fUm3TmbEtguw7vR+nGtnDjY= +github.com/grpc-ecosystem/grpc-gateway v1.14.3/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/jackpal/gateway v1.0.5 h1:qzXWUJfuMdlLMtt0a3Dgt+xkWQiA5itDEITVJtuSwMc= @@ -228,11 +231,11 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -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/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= +github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -274,20 +277,27 @@ golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnf golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 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-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190206173232-65e2d4e15006 h1:bfLnR+k0tq5Lqt6dflRLcZiz6UaXCMt3vhYJ1l4FQ80= 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/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 h1:2mqDk8w/o6UmeUCu5Qiq2y7iMf6anbx+YA8d1JFoFrs= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 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= @@ -302,6 +312,7 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190209173611-3b5209105503 h1:5SvYFrOM3W8Mexn9/oA44Ji7vhXAZQ9hiP+1Q/DMrWg= 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-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd h1:DBH9mDw0zluJT/R+nGuV3jWFWLFaHyYZWD4tOT+cjn0= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= @@ -313,21 +324,29 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2 h1:+DCIGbF/swA92ohVg0//6X2I golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/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-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190201180003-4b09977fb922 h1:mBVYJnbrXLA/ZCBTCe7PtEgAUP+1bg92qTaFoPHdz+8= google.golang.org/genproto v0.0.0-20190201180003-4b09977fb922/go.mod h1:L3J43x8/uS+qIUoksaLKe6OS3nUKxOKuIFz1sl2/jx4= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c h1:hrpEMCZ2O7DR5gC1n2AJGVhrwiEjOi35+jxtIuZpTMo= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.18.0 h1:IZl7mfBGfbhYx2p2rKRtYgDFw6SBz+kclmxYrCksPPA= google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= @@ -343,15 +362,17 @@ gopkg.in/macaroon.v2 v2.0.0 h1:LVWycAfeJBUjCIqfR9gqlo7I8vmiXRr51YEOZ1suop8= gopkg.in/macaroon.v2 v2.0.0/go.mod h1:+I6LnTMkm/uV5ew/0nsulNjL16SK4+C8yDmRUzHR17I= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 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= 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-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= diff --git a/lnrpc/README.md b/lnrpc/README.md index d07e548ee9..e7bab919e6 100644 --- a/lnrpc/README.md +++ b/lnrpc/README.md @@ -166,26 +166,26 @@ $ unzip protoc-3.4.0-osx-x86_64.zip -d protoc $ export PATH=$PWD/protoc/bin:$PATH ``` -2. Install `golang/protobuf` at commit `b5d812f8a3706043e23a9cd5babf2e5423744d30` (v1.3.1). +2. Install `golang/protobuf` at version `v1.3.2`. ```bash $ git clone https://github.com/golang/protobuf $GOPATH/src/github.com/golang/protobuf $ cd $GOPATH/src/github.com/golang/protobuf -$ git reset --hard v1.3.1 +$ git reset --hard v1.3.2 $ make ``` -3. Install 'genproto' at commit `a8101f21cf983e773d0c1133ebc5424792003214`. +3. Install 'genproto' at commit `20e1ac93f88cf06d2b1defb90b9e9e126c7dfff6`. ```bash $ go get google.golang.org/genproto $ cd $GOPATH/src/google.golang.org/genproto -$ git reset --hard a8101f21cf983e773d0c1133ebc5424792003214 +$ git reset --hard 20e1ac93f88cf06d2b1defb90b9e9e126c7dfff6 ``` -4. Install `grpc-ecosystem/grpc-gateway` at version `v1.8.6`. +4. Install `grpc-ecosystem/grpc-gateway` at version `v1.14.3`. ```bash $ git clone https://github.com/grpc-ecosystem/grpc-gateway $GOPATH/src/github.com/grpc-ecosystem/grpc-gateway $ cd $GOPATH/src/github.com/grpc-ecosystem/grpc-gateway -$ git reset --hard v1.8.6 +$ git reset --hard v1.14.3 $ go install ./protoc-gen-grpc-gateway ./protoc-gen-swagger ``` diff --git a/lnrpc/autopilotrpc/autopilot.pb.go b/lnrpc/autopilotrpc/autopilot.pb.go index 628da9ba46..4d59a7c481 100644 --- a/lnrpc/autopilotrpc/autopilot.pb.go +++ b/lnrpc/autopilotrpc/autopilot.pb.go @@ -8,6 +8,8 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" math "math" ) @@ -524,6 +526,23 @@ type AutopilotServer interface { SetScores(context.Context, *SetScoresRequest) (*SetScoresResponse, error) } +// UnimplementedAutopilotServer can be embedded to have forward compatible implementations. +type UnimplementedAutopilotServer struct { +} + +func (*UnimplementedAutopilotServer) Status(ctx context.Context, req *StatusRequest) (*StatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Status not implemented") +} +func (*UnimplementedAutopilotServer) ModifyStatus(ctx context.Context, req *ModifyStatusRequest) (*ModifyStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ModifyStatus not implemented") +} +func (*UnimplementedAutopilotServer) QueryScores(ctx context.Context, req *QueryScoresRequest) (*QueryScoresResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryScores not implemented") +} +func (*UnimplementedAutopilotServer) SetScores(ctx context.Context, req *SetScoresRequest) (*SetScoresResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetScores not implemented") +} + func RegisterAutopilotServer(s *grpc.Server, srv AutopilotServer) { s.RegisterService(&_Autopilot_serviceDesc, srv) } diff --git a/lnrpc/autopilotrpc/autopilot.pb.gw.go b/lnrpc/autopilotrpc/autopilot.pb.gw.go new file mode 100644 index 0000000000..8ec688a46a --- /dev/null +++ b/lnrpc/autopilotrpc/autopilot.pb.gw.go @@ -0,0 +1,380 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: autopilotrpc/autopilot.proto + +/* +Package autopilotrpc is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package autopilotrpc + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage + +func request_Autopilot_Status_0(ctx context.Context, marshaler runtime.Marshaler, client AutopilotClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq StatusRequest + var metadata runtime.ServerMetadata + + msg, err := client.Status(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Autopilot_Status_0(ctx context.Context, marshaler runtime.Marshaler, server AutopilotServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq StatusRequest + var metadata runtime.ServerMetadata + + msg, err := server.Status(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Autopilot_ModifyStatus_0(ctx context.Context, marshaler runtime.Marshaler, client AutopilotClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ModifyStatusRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ModifyStatus(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Autopilot_ModifyStatus_0(ctx context.Context, marshaler runtime.Marshaler, server AutopilotServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ModifyStatusRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ModifyStatus(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Autopilot_QueryScores_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Autopilot_QueryScores_0(ctx context.Context, marshaler runtime.Marshaler, client AutopilotClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryScoresRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Autopilot_QueryScores_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.QueryScores(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Autopilot_QueryScores_0(ctx context.Context, marshaler runtime.Marshaler, server AutopilotServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryScoresRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Autopilot_QueryScores_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.QueryScores(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Autopilot_SetScores_0(ctx context.Context, marshaler runtime.Marshaler, client AutopilotClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SetScoresRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.SetScores(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Autopilot_SetScores_0(ctx context.Context, marshaler runtime.Marshaler, server AutopilotServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SetScoresRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SetScores(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterAutopilotHandlerServer registers the http handlers for service Autopilot to "mux". +// UnaryRPC :call AutopilotServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +func RegisterAutopilotHandlerServer(ctx context.Context, mux *runtime.ServeMux, server AutopilotServer) error { + + mux.Handle("GET", pattern_Autopilot_Status_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Autopilot_Status_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Autopilot_Status_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Autopilot_ModifyStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Autopilot_ModifyStatus_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Autopilot_ModifyStatus_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Autopilot_QueryScores_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Autopilot_QueryScores_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Autopilot_QueryScores_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Autopilot_SetScores_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Autopilot_SetScores_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Autopilot_SetScores_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterAutopilotHandlerFromEndpoint is same as RegisterAutopilotHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterAutopilotHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterAutopilotHandler(ctx, mux, conn) +} + +// RegisterAutopilotHandler registers the http handlers for service Autopilot to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterAutopilotHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterAutopilotHandlerClient(ctx, mux, NewAutopilotClient(conn)) +} + +// RegisterAutopilotHandlerClient registers the http handlers for service Autopilot +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "AutopilotClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "AutopilotClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "AutopilotClient" to call the correct interceptors. +func RegisterAutopilotHandlerClient(ctx context.Context, mux *runtime.ServeMux, client AutopilotClient) error { + + mux.Handle("GET", pattern_Autopilot_Status_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Autopilot_Status_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Autopilot_Status_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Autopilot_ModifyStatus_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Autopilot_ModifyStatus_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Autopilot_ModifyStatus_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Autopilot_QueryScores_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Autopilot_QueryScores_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Autopilot_QueryScores_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Autopilot_SetScores_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Autopilot_SetScores_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Autopilot_SetScores_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Autopilot_Status_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "autopilot", "status"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Autopilot_ModifyStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "autopilot", "modify"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Autopilot_QueryScores_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "autopilot", "scores"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Autopilot_SetScores_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "autopilot", "scores"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_Autopilot_Status_0 = runtime.ForwardResponseMessage + + forward_Autopilot_ModifyStatus_0 = runtime.ForwardResponseMessage + + forward_Autopilot_QueryScores_0 = runtime.ForwardResponseMessage + + forward_Autopilot_SetScores_0 = runtime.ForwardResponseMessage +) diff --git a/lnrpc/autopilotrpc/autopilot.swagger.json b/lnrpc/autopilotrpc/autopilot.swagger.json index 78d291b980..0149810cef 100644 --- a/lnrpc/autopilotrpc/autopilot.swagger.json +++ b/lnrpc/autopilotrpc/autopilot.swagger.json @@ -4,17 +4,144 @@ "title": "autopilotrpc/autopilot.proto", "version": "version not set" }, - "schemes": [ - "http", - "https" - ], "consumes": [ "application/json" ], "produces": [ "application/json" ], - "paths": {}, + "paths": { + "/v2/autopilot/modify": { + "post": { + "summary": "ModifyStatus is used to modify the status of the autopilot agent, like\nenabling or disabling it.", + "operationId": "ModifyStatus", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/autopilotrpcModifyStatusResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/autopilotrpcModifyStatusRequest" + } + } + ], + "tags": [ + "Autopilot" + ] + } + }, + "/v2/autopilot/scores": { + "get": { + "summary": "QueryScores queries all available autopilot heuristics, in addition to any\nactive combination of these heruristics, for the scores they would give to\nthe given nodes.", + "operationId": "QueryScores", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/autopilotrpcQueryScoresResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "pubkeys", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "string" + }, + "collectionFormat": "multi" + }, + { + "name": "ignore_local_state", + "description": "If set, we will ignore the local channel state when calculating scores.", + "in": "query", + "required": false, + "type": "boolean", + "format": "boolean" + } + ], + "tags": [ + "Autopilot" + ] + }, + "post": { + "summary": "SetScores attempts to set the scores used by the running autopilot agent,\nif the external scoring heuristic is enabled.", + "operationId": "SetScores", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/autopilotrpcSetScoresResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/autopilotrpcSetScoresRequest" + } + } + ], + "tags": [ + "Autopilot" + ] + } + }, + "/v2/autopilot/status": { + "get": { + "summary": "Status returns whether the daemon's autopilot agent is active.", + "operationId": "Status", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/autopilotrpcStatusResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "Autopilot" + ] + } + } + }, "definitions": { "QueryScoresResponseHeuristicResult": { "type": "object", @@ -31,6 +158,16 @@ } } }, + "autopilotrpcModifyStatusRequest": { + "type": "object", + "properties": { + "enable": { + "type": "boolean", + "format": "boolean", + "description": "Whether the autopilot agent should be enabled or not." + } + } + }, "autopilotrpcModifyStatusResponse": { "type": "object" }, @@ -45,6 +182,23 @@ } } }, + "autopilotrpcSetScoresRequest": { + "type": "object", + "properties": { + "heuristic": { + "type": "string", + "description": "The name of the heuristic to provide scores to." + }, + "scores": { + "type": "object", + "additionalProperties": { + "type": "number", + "format": "double" + }, + "description": "A map from hex-encoded public keys to scores. Scores must be in the range\n[0.0, 1.0]." + } + } + }, "autopilotrpcSetScoresResponse": { "type": "object" }, @@ -57,6 +211,39 @@ "description": "Indicates whether the autopilot is active or not." } } + }, + "protobufAny": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } } } } diff --git a/lnrpc/autopilotrpc/autopilot_server.go b/lnrpc/autopilotrpc/autopilot_server.go index 4a938072c7..fd9649ad9a 100644 --- a/lnrpc/autopilotrpc/autopilot_server.go +++ b/lnrpc/autopilotrpc/autopilot_server.go @@ -8,6 +8,7 @@ import ( "sync/atomic" "github.com/btcsuite/btcd/btcec" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/lightningnetwork/lnd/autopilot" "github.com/lightningnetwork/lnd/lnrpc" "google.golang.org/grpc" @@ -129,6 +130,28 @@ func (s *Server) RegisterWithRootServer(grpcServer *grpc.Server) error { return nil } +// RegisterWithRestServer will be called by the root REST mux to direct a sub +// RPC server to register itself with the main REST mux server. Until this is +// called, each sub-server won't be able to have requests routed towards it. +// +// NOTE: This is part of the lnrpc.SubServer interface. +func (s *Server) RegisterWithRestServer(ctx context.Context, + mux *runtime.ServeMux, dest string, opts []grpc.DialOption) error { + + // We make sure that we register it with the main REST server to ensure + // all our methods are routed properly. + err := RegisterAutopilotHandlerFromEndpoint(ctx, mux, dest, opts) + if err != nil { + log.Errorf("Could not register Autopilot REST server "+ + "with root REST server: %v", err) + return err + } + + log.Debugf("Autopilot REST server successfully registered with " + + "root REST server") + return nil +} + // Status returns the current status of the autopilot agent. // // NOTE: Part of the AutopilotServer interface. diff --git a/lnrpc/chainrpc/chainnotifier.pb.go b/lnrpc/chainrpc/chainnotifier.pb.go index db9c13943c..746dab255e 100644 --- a/lnrpc/chainrpc/chainnotifier.pb.go +++ b/lnrpc/chainrpc/chainnotifier.pb.go @@ -8,6 +8,8 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" math "math" ) @@ -833,6 +835,20 @@ type ChainNotifierServer interface { RegisterBlockEpochNtfn(*BlockEpoch, ChainNotifier_RegisterBlockEpochNtfnServer) error } +// UnimplementedChainNotifierServer can be embedded to have forward compatible implementations. +type UnimplementedChainNotifierServer struct { +} + +func (*UnimplementedChainNotifierServer) RegisterConfirmationsNtfn(req *ConfRequest, srv ChainNotifier_RegisterConfirmationsNtfnServer) error { + return status.Errorf(codes.Unimplemented, "method RegisterConfirmationsNtfn not implemented") +} +func (*UnimplementedChainNotifierServer) RegisterSpendNtfn(req *SpendRequest, srv ChainNotifier_RegisterSpendNtfnServer) error { + return status.Errorf(codes.Unimplemented, "method RegisterSpendNtfn not implemented") +} +func (*UnimplementedChainNotifierServer) RegisterBlockEpochNtfn(req *BlockEpoch, srv ChainNotifier_RegisterBlockEpochNtfnServer) error { + return status.Errorf(codes.Unimplemented, "method RegisterBlockEpochNtfn not implemented") +} + func RegisterChainNotifierServer(s *grpc.Server, srv ChainNotifierServer) { s.RegisterService(&_ChainNotifier_serviceDesc, srv) } diff --git a/lnrpc/chainrpc/chainnotifier.pb.gw.go b/lnrpc/chainrpc/chainnotifier.pb.gw.go new file mode 100644 index 0000000000..1d6e496a28 --- /dev/null +++ b/lnrpc/chainrpc/chainnotifier.pb.gw.go @@ -0,0 +1,253 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: chainrpc/chainnotifier.proto + +/* +Package chainrpc is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package chainrpc + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage + +func request_ChainNotifier_RegisterConfirmationsNtfn_0(ctx context.Context, marshaler runtime.Marshaler, client ChainNotifierClient, req *http.Request, pathParams map[string]string) (ChainNotifier_RegisterConfirmationsNtfnClient, runtime.ServerMetadata, error) { + var protoReq ConfRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.RegisterConfirmationsNtfn(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_ChainNotifier_RegisterSpendNtfn_0(ctx context.Context, marshaler runtime.Marshaler, client ChainNotifierClient, req *http.Request, pathParams map[string]string) (ChainNotifier_RegisterSpendNtfnClient, runtime.ServerMetadata, error) { + var protoReq SpendRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.RegisterSpendNtfn(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_ChainNotifier_RegisterBlockEpochNtfn_0(ctx context.Context, marshaler runtime.Marshaler, client ChainNotifierClient, req *http.Request, pathParams map[string]string) (ChainNotifier_RegisterBlockEpochNtfnClient, runtime.ServerMetadata, error) { + var protoReq BlockEpoch + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.RegisterBlockEpochNtfn(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +// RegisterChainNotifierHandlerServer registers the http handlers for service ChainNotifier to "mux". +// UnaryRPC :call ChainNotifierServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +func RegisterChainNotifierHandlerServer(ctx context.Context, mux *runtime.ServeMux, server ChainNotifierServer) error { + + mux.Handle("POST", pattern_ChainNotifier_RegisterConfirmationsNtfn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_ChainNotifier_RegisterSpendNtfn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_ChainNotifier_RegisterBlockEpochNtfn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + return nil +} + +// RegisterChainNotifierHandlerFromEndpoint is same as RegisterChainNotifierHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterChainNotifierHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterChainNotifierHandler(ctx, mux, conn) +} + +// RegisterChainNotifierHandler registers the http handlers for service ChainNotifier to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterChainNotifierHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterChainNotifierHandlerClient(ctx, mux, NewChainNotifierClient(conn)) +} + +// RegisterChainNotifierHandlerClient registers the http handlers for service ChainNotifier +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "ChainNotifierClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "ChainNotifierClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "ChainNotifierClient" to call the correct interceptors. +func RegisterChainNotifierHandlerClient(ctx context.Context, mux *runtime.ServeMux, client ChainNotifierClient) error { + + mux.Handle("POST", pattern_ChainNotifier_RegisterConfirmationsNtfn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ChainNotifier_RegisterConfirmationsNtfn_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ChainNotifier_RegisterConfirmationsNtfn_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ChainNotifier_RegisterSpendNtfn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ChainNotifier_RegisterSpendNtfn_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ChainNotifier_RegisterSpendNtfn_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_ChainNotifier_RegisterBlockEpochNtfn_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_ChainNotifier_RegisterBlockEpochNtfn_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_ChainNotifier_RegisterBlockEpochNtfn_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_ChainNotifier_RegisterConfirmationsNtfn_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "chainnotifier", "register", "confirmations"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ChainNotifier_RegisterSpendNtfn_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "chainnotifier", "register", "spends"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_ChainNotifier_RegisterBlockEpochNtfn_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "chainnotifier", "register", "blocks"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_ChainNotifier_RegisterConfirmationsNtfn_0 = runtime.ForwardResponseStream + + forward_ChainNotifier_RegisterSpendNtfn_0 = runtime.ForwardResponseStream + + forward_ChainNotifier_RegisterBlockEpochNtfn_0 = runtime.ForwardResponseStream +) diff --git a/lnrpc/chainrpc/chainnotifier.swagger.json b/lnrpc/chainrpc/chainnotifier.swagger.json index 7d10109792..c6999b94d2 100644 --- a/lnrpc/chainrpc/chainnotifier.swagger.json +++ b/lnrpc/chainrpc/chainnotifier.swagger.json @@ -4,17 +4,143 @@ "title": "chainrpc/chainnotifier.proto", "version": "version not set" }, - "schemes": [ - "http", - "https" - ], "consumes": [ "application/json" ], "produces": [ "application/json" ], - "paths": {}, + "paths": { + "/v2/chainnotifier/register/blocks": { + "post": { + "summary": "RegisterBlockEpochNtfn is a synchronous response-streaming RPC that\nregisters an intent for a client to be notified of blocks in the chain. The\nstream will return a hash and height tuple of a block for each new/stale\nblock in the chain. It is the client's responsibility to determine whether\nthe tuple returned is for a new or stale block in the chain.", + "description": "A client can also request a historical backlog of blocks from a particular\npoint. This allows clients to be idempotent by ensuring that they do not\nmissing processing a single block within the chain.", + "operationId": "RegisterBlockEpochNtfn", + "responses": { + "200": { + "description": "A successful response.(streaming responses)", + "schema": { + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/chainrpcBlockEpoch" + }, + "error": { + "$ref": "#/definitions/runtimeStreamError" + } + }, + "title": "Stream result of chainrpcBlockEpoch" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/chainrpcBlockEpoch" + } + } + ], + "tags": [ + "ChainNotifier" + ] + } + }, + "/v2/chainnotifier/register/confirmations": { + "post": { + "summary": "RegisterConfirmationsNtfn is a synchronous response-streaming RPC that\nregisters an intent for a client to be notified once a confirmation request\nhas reached its required number of confirmations on-chain.", + "description": "A client can specify whether the confirmation request should be for a\nparticular transaction by its hash or for an output script by specifying a\nzero hash.", + "operationId": "RegisterConfirmationsNtfn", + "responses": { + "200": { + "description": "A successful response.(streaming responses)", + "schema": { + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/chainrpcConfEvent" + }, + "error": { + "$ref": "#/definitions/runtimeStreamError" + } + }, + "title": "Stream result of chainrpcConfEvent" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/chainrpcConfRequest" + } + } + ], + "tags": [ + "ChainNotifier" + ] + } + }, + "/v2/chainnotifier/register/spends": { + "post": { + "summary": "RegisterSpendNtfn is a synchronous response-streaming RPC that registers an\nintent for a client to be notification once a spend request has been spent\nby a transaction that has confirmed on-chain.", + "description": "A client can specify whether the spend request should be for a particular\noutpoint or for an output script by specifying a zero outpoint.", + "operationId": "RegisterSpendNtfn", + "responses": { + "200": { + "description": "A successful response.(streaming responses)", + "schema": { + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/chainrpcSpendEvent" + }, + "error": { + "$ref": "#/definitions/runtimeStreamError" + } + }, + "title": "Stream result of chainrpcSpendEvent" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/chainrpcSpendRequest" + } + } + ], + "tags": [ + "ChainNotifier" + ] + } + } + }, "definitions": { "chainrpcBlockEpoch": { "type": "object", @@ -69,6 +195,31 @@ } } }, + "chainrpcConfRequest": { + "type": "object", + "properties": { + "txid": { + "type": "string", + "format": "byte", + "description": "The transaction hash for which we should request a confirmation notification\nfor. If set to a hash of all zeros, then the confirmation notification will\nbe requested for the script instead." + }, + "script": { + "type": "string", + "format": "byte", + "description": "An output script within a transaction with the hash above which will be used\nby light clients to match block filters. If the transaction hash is set to a\nhash of all zeros, then a confirmation notification will be requested for\nthis script instead." + }, + "num_confs": { + "type": "integer", + "format": "int64", + "description": "The number of desired confirmations the transaction/output script should\nreach before dispatching a confirmation notification." + }, + "height_hint": { + "type": "integer", + "format": "int64", + "description": "The earliest height in the chain for which the transaction/output script\ncould have been included in a block. This should in most cases be set to the\nbroadcast height of the transaction/output script." + } + } + }, "chainrpcOutpoint": { "type": "object", "properties": { @@ -129,6 +280,25 @@ } } }, + "chainrpcSpendRequest": { + "type": "object", + "properties": { + "outpoint": { + "$ref": "#/definitions/chainrpcOutpoint", + "description": "The outpoint for which we should request a spend notification for. If set to\na zero outpoint, then the spend notification will be requested for the\nscript instead." + }, + "script": { + "type": "string", + "format": "byte", + "description": "The output script for the outpoint above. This will be used by light clients\nto match block filters. If the outpoint is set to a zero outpoint, then a\nspend notification will be requested for this script instead." + }, + "height_hint": { + "type": "integer", + "format": "int64", + "description": "The earliest height in the chain for which the outpoint/output script could\nhave been spent. This should in most cases be set to the broadcast height of\nthe outpoint/output script." + } + } + }, "protobufAny": { "type": "object", "properties": { @@ -141,6 +311,27 @@ } } }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } + }, "runtimeStreamError": { "type": "object", "properties": { @@ -166,43 +357,5 @@ } } } - }, - "x-stream-definitions": { - "chainrpcBlockEpoch": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/chainrpcBlockEpoch" - }, - "error": { - "$ref": "#/definitions/runtimeStreamError" - } - }, - "title": "Stream result of chainrpcBlockEpoch" - }, - "chainrpcConfEvent": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/chainrpcConfEvent" - }, - "error": { - "$ref": "#/definitions/runtimeStreamError" - } - }, - "title": "Stream result of chainrpcConfEvent" - }, - "chainrpcSpendEvent": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/chainrpcSpendEvent" - }, - "error": { - "$ref": "#/definitions/runtimeStreamError" - } - }, - "title": "Stream result of chainrpcSpendEvent" - } } } diff --git a/lnrpc/chainrpc/chainnotifier_server.go b/lnrpc/chainrpc/chainnotifier_server.go index 261f760515..afa53c013f 100644 --- a/lnrpc/chainrpc/chainnotifier_server.go +++ b/lnrpc/chainrpc/chainnotifier_server.go @@ -13,6 +13,7 @@ import ( "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/wire" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/lightningnetwork/lnd/chainntnfs" "github.com/lightningnetwork/lnd/lnrpc" "google.golang.org/grpc" @@ -189,6 +190,28 @@ func (s *Server) RegisterWithRootServer(grpcServer *grpc.Server) error { return nil } +// RegisterWithRestServer will be called by the root REST mux to direct a sub +// RPC server to register itself with the main REST mux server. Until this is +// called, each sub-server won't be able to have requests routed towards it. +// +// NOTE: This is part of the lnrpc.SubServer interface. +func (s *Server) RegisterWithRestServer(ctx context.Context, + mux *runtime.ServeMux, dest string, opts []grpc.DialOption) error { + + // We make sure that we register it with the main REST server to ensure + // all our methods are routed properly. + err := RegisterChainNotifierHandlerFromEndpoint(ctx, mux, dest, opts) + if err != nil { + log.Errorf("Could not register ChainNotifier REST server "+ + "with root REST server: %v", err) + return err + } + + log.Debugf("ChainNotifier REST server successfully registered with " + + "root REST server") + return nil +} + // RegisterConfirmationsNtfn is a synchronous response-streaming RPC that // registers an intent for a client to be notified once a confirmation request // has reached its required number of confirmations on-chain. diff --git a/lnrpc/gen_protos.sh b/lnrpc/gen_protos.sh index 18d07b2636..78c3270dfd 100755 --- a/lnrpc/gen_protos.sh +++ b/lnrpc/gen_protos.sh @@ -12,19 +12,17 @@ for file in $PROTOS; do # Generate the protos. protoc -I/usr/local/include -I. \ - -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \ --go_out=plugins=grpc,paths=source_relative:. \ "${file}" # Generate the REST reverse proxy. protoc -I/usr/local/include -I. \ - -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \ - --grpc-gateway_out=logtostderr=true,paths=source_relative:. \ + --grpc-gateway_out=logtostderr=true,paths=source_relative,grpc_api_configuration=rest-annotations.yaml:. \ "${file}" + # Finally, generate the swagger file which describes the REST API in detail. protoc -I/usr/local/include -I. \ - -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \ - --swagger_out=logtostderr=true:. \ + --swagger_out=logtostderr=true,grpc_api_configuration=rest-annotations.yaml:. \ "${file}" done diff --git a/lnrpc/invoicesrpc/invoices.pb.go b/lnrpc/invoicesrpc/invoices.pb.go index eb8d86cd60..2dde23d1ee 100644 --- a/lnrpc/invoicesrpc/invoices.pb.go +++ b/lnrpc/invoicesrpc/invoices.pb.go @@ -8,8 +8,9 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" lnrpc "github.com/lightningnetwork/lnd/lnrpc" - _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" math "math" ) @@ -399,41 +400,40 @@ func init() { func init() { proto.RegisterFile("invoicesrpc/invoices.proto", fileDescriptor_090ab9c4958b987d) } var fileDescriptor_090ab9c4958b987d = []byte{ - // 541 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x53, 0xc1, 0x6e, 0xd3, 0x40, - 0x10, 0x95, 0xd3, 0x34, 0x4d, 0x26, 0x69, 0x1a, 0x16, 0x5a, 0x59, 0x16, 0xa1, 0xc1, 0x1c, 0x08, - 0x1c, 0x6c, 0xda, 0x8a, 0x1b, 0x1c, 0x0a, 0x42, 0x0a, 0x48, 0xe5, 0xe0, 0x08, 0x0e, 0x5c, 0xac, - 0x8d, 0xbd, 0xd8, 0xab, 0xda, 0xbb, 0xcb, 0xee, 0x26, 0xd0, 0x5f, 0xe4, 0x0f, 0xf8, 0x1b, 0xe4, - 0xf5, 0xa6, 0xb2, 0x43, 0xe9, 0x6d, 0xe6, 0xcd, 0xec, 0xcb, 0xcb, 0x7b, 0x63, 0xf0, 0x28, 0xdb, - 0x70, 0x9a, 0x10, 0x25, 0x45, 0x12, 0x6e, 0xeb, 0x40, 0x48, 0xae, 0x39, 0x1a, 0x36, 0x66, 0xde, - 0xe3, 0x8c, 0xf3, 0xac, 0x20, 0x21, 0x16, 0x34, 0xc4, 0x8c, 0x71, 0x8d, 0x35, 0xe5, 0xcc, 0xae, - 0x7a, 0x03, 0x29, 0x92, 0xba, 0xf4, 0x5f, 0xc3, 0xe4, 0x3d, 0x66, 0x09, 0x29, 0x3e, 0xd6, 0xaf, - 0xaf, 0x54, 0x86, 0x9e, 0xc2, 0x48, 0xe0, 0x9b, 0x92, 0x30, 0x1d, 0xe7, 0x58, 0xe5, 0xae, 0x33, - 0x73, 0xe6, 0xa3, 0x68, 0x68, 0xb1, 0x05, 0x56, 0xb9, 0xff, 0x10, 0x1e, 0xb4, 0x9e, 0x45, 0x44, - 0x09, 0xff, 0x77, 0x07, 0x8e, 0x2f, 0xd3, 0x74, 0xc1, 0x8b, 0xf4, 0x16, 0xfe, 0xb1, 0x26, 0x4a, - 0x23, 0x04, 0xdd, 0x92, 0x94, 0xdc, 0x30, 0x0d, 0x22, 0x53, 0x57, 0x98, 0x61, 0xef, 0x18, 0x76, - 0x53, 0xa3, 0x47, 0xb0, 0xbf, 0xc1, 0xc5, 0x9a, 0xb8, 0x7b, 0x33, 0x67, 0xbe, 0x17, 0xd5, 0x0d, - 0x9a, 0x02, 0x98, 0x22, 0x2e, 0x15, 0xd6, 0x2e, 0x98, 0xd1, 0xc0, 0x20, 0x57, 0x0a, 0x6b, 0xf4, - 0x02, 0x26, 0x29, 0x51, 0x89, 0xa4, 0xa2, 0xfa, 0x8f, 0xb5, 0xe4, 0xae, 0x21, 0x3d, 0x6a, 0xe0, - 0x95, 0x6c, 0x74, 0x02, 0x3d, 0xf2, 0x4b, 0x50, 0x79, 0xe3, 0xee, 0x1b, 0x16, 0xdb, 0xa1, 0x67, - 0x70, 0xf8, 0x1d, 0x17, 0xc5, 0x0a, 0x27, 0xd7, 0x31, 0x4e, 0x53, 0xe9, 0xf6, 0x8c, 0xd0, 0xd1, - 0x16, 0xbc, 0x4c, 0x53, 0x89, 0x4e, 0x61, 0x98, 0x14, 0x7a, 0x13, 0x5b, 0x86, 0x83, 0x99, 0x33, - 0xef, 0x46, 0x50, 0x41, 0x1f, 0x6a, 0x96, 0x33, 0x18, 0x4a, 0xbe, 0xd6, 0x24, 0xce, 0x29, 0xd3, - 0xca, 0xed, 0xcf, 0xf6, 0xe6, 0xc3, 0xf3, 0x49, 0x50, 0xb0, 0xca, 0xee, 0xa8, 0x9a, 0x2c, 0x28, - 0xd3, 0x11, 0xc8, 0x6d, 0xa9, 0x90, 0x0b, 0x07, 0x42, 0xd2, 0x0d, 0xd6, 0xc4, 0x1d, 0xcc, 0x9c, - 0x79, 0x3f, 0xda, 0xb6, 0xfe, 0x5b, 0x40, 0xbb, 0x5e, 0x2a, 0x81, 0x9e, 0xc3, 0xd1, 0x36, 0x1a, - 0x59, 0x7b, 0x6b, 0x3d, 0x1d, 0x5b, 0xd8, 0x3a, 0xee, 0x07, 0x30, 0x59, 0x12, 0xad, 0x0b, 0xd2, - 0xc8, 0xd5, 0x83, 0xbe, 0x90, 0x84, 0x96, 0x38, 0x23, 0x36, 0xd3, 0xdb, 0xbe, 0x0a, 0xb4, 0xb5, - 0x6f, 0x02, 0x7d, 0x03, 0xd3, 0xe5, 0x7a, 0x55, 0x59, 0xb8, 0x22, 0x4b, 0xca, 0xb2, 0xc6, 0xb4, - 0xce, 0xf5, 0x18, 0x7a, 0x32, 0x6e, 0xa4, 0xb8, 0x2f, 0x2b, 0x9b, 0x3f, 0x75, 0xfb, 0xce, 0xa4, - 0x73, 0xfe, 0xa7, 0x03, 0x7d, 0xbb, 0xaf, 0xd0, 0x57, 0x38, 0xb9, 0x9b, 0x0a, 0xbd, 0x0c, 0x1a, - 0x87, 0x1b, 0xdc, 0xfb, 0x7b, 0xde, 0xd8, 0x9a, 0x69, 0xe1, 0x57, 0x0e, 0xfa, 0x0c, 0x87, 0xad, - 0x43, 0x44, 0xd3, 0x16, 0xdd, 0xee, 0x6d, 0x7b, 0x4f, 0xfe, 0x3f, 0x36, 0x06, 0x7f, 0x81, 0x71, - 0xdb, 0x76, 0xe4, 0xb7, 0x5e, 0xdc, 0x79, 0xdf, 0xde, 0xe9, 0xbd, 0x3b, 0x4a, 0x54, 0x32, 0x5b, - 0xf6, 0xee, 0xc8, 0xdc, 0x8d, 0x6a, 0x47, 0xe6, 0x3f, 0xc9, 0xbc, 0xbb, 0xf8, 0x76, 0x96, 0x51, - 0x9d, 0xaf, 0x57, 0x41, 0xc2, 0xcb, 0xb0, 0xa0, 0x59, 0xae, 0x19, 0x65, 0x19, 0x23, 0xfa, 0x27, - 0x97, 0xd7, 0x61, 0xc1, 0xd2, 0xd0, 0x38, 0x15, 0x36, 0x68, 0x56, 0x3d, 0xf3, 0xc9, 0x5f, 0xfc, - 0x0d, 0x00, 0x00, 0xff, 0xff, 0x56, 0x22, 0x58, 0xe6, 0x46, 0x04, 0x00, 0x00, + // 523 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x53, 0x4d, 0x6f, 0xd3, 0x40, + 0x10, 0x95, 0xf3, 0xd5, 0x64, 0x92, 0xa6, 0x61, 0xa1, 0x95, 0x65, 0x29, 0x34, 0x98, 0x03, 0x81, + 0x83, 0x43, 0x5b, 0x71, 0x83, 0x43, 0x41, 0x48, 0x01, 0xa9, 0x1c, 0x1c, 0xc1, 0x81, 0x8b, 0xb5, + 0xb1, 0x17, 0x7b, 0xd5, 0xf5, 0x7a, 0xd9, 0xdd, 0x04, 0xfa, 0x17, 0xf9, 0x07, 0xfc, 0x1b, 0xe4, + 0xf5, 0xa6, 0xb2, 0x43, 0xdb, 0xdb, 0xcc, 0x9b, 0xd9, 0xe7, 0xa7, 0xf7, 0xc6, 0xe0, 0x51, 0xbe, + 0x2d, 0x68, 0x4c, 0x94, 0x14, 0xf1, 0x62, 0x57, 0x07, 0x42, 0x16, 0xba, 0x40, 0xc3, 0xda, 0xcc, + 0x1b, 0x48, 0x11, 0x57, 0xb8, 0xff, 0x06, 0x26, 0x1f, 0x30, 0x8f, 0x09, 0xfb, 0x54, 0xcd, 0xaf, + 0x54, 0x8a, 0x9e, 0xc1, 0x48, 0xe0, 0x9b, 0x9c, 0x70, 0x1d, 0x65, 0x58, 0x65, 0xae, 0x33, 0x73, + 0xe6, 0xa3, 0x70, 0x68, 0xb1, 0x25, 0x56, 0x99, 0xff, 0x18, 0x1e, 0x35, 0x9e, 0x85, 0x44, 0x09, + 0xff, 0x4f, 0x0b, 0x8e, 0x2f, 0x93, 0x64, 0x59, 0xb0, 0xe4, 0x16, 0xfe, 0xb9, 0x21, 0x4a, 0x23, + 0x04, 0x9d, 0x9c, 0xe4, 0x85, 0x61, 0x1a, 0x84, 0xa6, 0x2e, 0x31, 0xc3, 0xde, 0x32, 0xec, 0xa6, + 0x46, 0x4f, 0xa0, 0xbb, 0xc5, 0x6c, 0x43, 0xdc, 0xf6, 0xcc, 0x99, 0xb7, 0xc3, 0xaa, 0x41, 0x53, + 0x00, 0x53, 0x44, 0xb9, 0xc2, 0xda, 0x05, 0x33, 0x1a, 0x18, 0xe4, 0x4a, 0x61, 0x8d, 0x5e, 0xc2, + 0x24, 0x21, 0x2a, 0x96, 0x54, 0x68, 0x5a, 0xf0, 0x4a, 0x72, 0xc7, 0x90, 0x1e, 0xd5, 0xf0, 0x52, + 0x36, 0x3a, 0x81, 0x1e, 0xf9, 0x2d, 0xa8, 0xbc, 0x71, 0xbb, 0x86, 0xc5, 0x76, 0xe8, 0x39, 0x1c, + 0xfe, 0xc0, 0x8c, 0xad, 0x71, 0x7c, 0x1d, 0xe1, 0x24, 0x91, 0x6e, 0xcf, 0x08, 0x1d, 0xed, 0xc0, + 0xcb, 0x24, 0x91, 0xe8, 0x14, 0x86, 0x31, 0xd3, 0xdb, 0xc8, 0x32, 0x1c, 0xcc, 0x9c, 0x79, 0x27, + 0x84, 0x12, 0xfa, 0x58, 0xb1, 0x9c, 0xc1, 0x50, 0x16, 0x1b, 0x4d, 0xa2, 0x8c, 0x72, 0xad, 0xdc, + 0xfe, 0xac, 0x3d, 0x1f, 0x9e, 0x4f, 0x02, 0xc6, 0x4b, 0xbb, 0xc3, 0x72, 0xb2, 0xa4, 0x5c, 0x87, + 0x20, 0x77, 0xa5, 0x42, 0x2e, 0x1c, 0x08, 0x49, 0xb7, 0x58, 0x13, 0x77, 0x30, 0x73, 0xe6, 0xfd, + 0x70, 0xd7, 0xfa, 0xef, 0x00, 0xed, 0x7b, 0xa9, 0x04, 0x7a, 0x01, 0x47, 0xbb, 0x68, 0x64, 0xe5, + 0xad, 0xf5, 0x74, 0x6c, 0x61, 0xeb, 0xb8, 0x1f, 0xc0, 0x64, 0x45, 0xb4, 0x66, 0xa4, 0x96, 0xab, + 0x07, 0x7d, 0x21, 0x09, 0xcd, 0x71, 0x4a, 0x6c, 0xa6, 0xb7, 0x7d, 0x19, 0x68, 0x63, 0xdf, 0x04, + 0xfa, 0x16, 0xa6, 0xab, 0xcd, 0xba, 0xb4, 0x70, 0x4d, 0x56, 0x94, 0xa7, 0xb5, 0x69, 0x95, 0xeb, + 0x31, 0xf4, 0x64, 0x54, 0x4b, 0xb1, 0x2b, 0x4b, 0x9b, 0x3f, 0x77, 0xfa, 0xce, 0xa4, 0x75, 0xfe, + 0xb7, 0x05, 0x7d, 0xbb, 0xaf, 0xd0, 0x37, 0x38, 0xb9, 0x9b, 0x0a, 0xbd, 0x0a, 0x6a, 0xa7, 0x19, + 0x3c, 0xf8, 0x3d, 0x6f, 0x6c, 0xcd, 0xb4, 0xf0, 0x6b, 0x07, 0x7d, 0x81, 0xc3, 0xc6, 0x21, 0xa2, + 0x69, 0x83, 0x6e, 0xff, 0xb6, 0xbd, 0xa7, 0xf7, 0x8f, 0x8d, 0xc1, 0x5f, 0x61, 0xdc, 0xb4, 0x1d, + 0xf9, 0x8d, 0x17, 0x77, 0xde, 0xb7, 0x77, 0xfa, 0xe0, 0x8e, 0x12, 0xa5, 0xcc, 0x86, 0xbd, 0x7b, + 0x32, 0xf7, 0xa3, 0xda, 0x93, 0xf9, 0x5f, 0x32, 0xef, 0x2f, 0xbe, 0x9f, 0xa5, 0x54, 0x67, 0x9b, + 0x75, 0x10, 0x17, 0xf9, 0x82, 0xd1, 0x34, 0xd3, 0x9c, 0xf2, 0x94, 0x13, 0xfd, 0xab, 0x90, 0xd7, + 0x0b, 0xc6, 0x93, 0x85, 0x71, 0x6a, 0x51, 0xa3, 0x59, 0xf7, 0xcc, 0x2f, 0x7f, 0xf1, 0x2f, 0x00, + 0x00, 0xff, 0xff, 0xc3, 0xb1, 0x8c, 0x5e, 0x28, 0x04, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -557,6 +557,23 @@ type InvoicesServer interface { SettleInvoice(context.Context, *SettleInvoiceMsg) (*SettleInvoiceResp, error) } +// UnimplementedInvoicesServer can be embedded to have forward compatible implementations. +type UnimplementedInvoicesServer struct { +} + +func (*UnimplementedInvoicesServer) SubscribeSingleInvoice(req *SubscribeSingleInvoiceRequest, srv Invoices_SubscribeSingleInvoiceServer) error { + return status.Errorf(codes.Unimplemented, "method SubscribeSingleInvoice not implemented") +} +func (*UnimplementedInvoicesServer) CancelInvoice(ctx context.Context, req *CancelInvoiceMsg) (*CancelInvoiceResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method CancelInvoice not implemented") +} +func (*UnimplementedInvoicesServer) AddHoldInvoice(ctx context.Context, req *AddHoldInvoiceRequest) (*AddHoldInvoiceResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddHoldInvoice not implemented") +} +func (*UnimplementedInvoicesServer) SettleInvoice(ctx context.Context, req *SettleInvoiceMsg) (*SettleInvoiceResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method SettleInvoice not implemented") +} + func RegisterInvoicesServer(s *grpc.Server, srv InvoicesServer) { s.RegisterService(&_Invoices_serviceDesc, srv) } diff --git a/lnrpc/invoicesrpc/invoices.pb.gw.go b/lnrpc/invoicesrpc/invoices.pb.gw.go new file mode 100644 index 0000000000..139882654e --- /dev/null +++ b/lnrpc/invoicesrpc/invoices.pb.gw.go @@ -0,0 +1,385 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: invoicesrpc/invoices.proto + +/* +Package invoicesrpc is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package invoicesrpc + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage + +func request_Invoices_SubscribeSingleInvoice_0(ctx context.Context, marshaler runtime.Marshaler, client InvoicesClient, req *http.Request, pathParams map[string]string) (Invoices_SubscribeSingleInvoiceClient, runtime.ServerMetadata, error) { + var protoReq SubscribeSingleInvoiceRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["r_hash"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "r_hash") + } + + protoReq.RHash, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "r_hash", err) + } + + stream, err := client.SubscribeSingleInvoice(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_Invoices_CancelInvoice_0(ctx context.Context, marshaler runtime.Marshaler, client InvoicesClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CancelInvoiceMsg + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CancelInvoice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Invoices_CancelInvoice_0(ctx context.Context, marshaler runtime.Marshaler, server InvoicesServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CancelInvoiceMsg + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CancelInvoice(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Invoices_AddHoldInvoice_0(ctx context.Context, marshaler runtime.Marshaler, client InvoicesClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AddHoldInvoiceRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.AddHoldInvoice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Invoices_AddHoldInvoice_0(ctx context.Context, marshaler runtime.Marshaler, server InvoicesServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AddHoldInvoiceRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.AddHoldInvoice(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Invoices_SettleInvoice_0(ctx context.Context, marshaler runtime.Marshaler, client InvoicesClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SettleInvoiceMsg + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.SettleInvoice(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Invoices_SettleInvoice_0(ctx context.Context, marshaler runtime.Marshaler, server InvoicesServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SettleInvoiceMsg + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SettleInvoice(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterInvoicesHandlerServer registers the http handlers for service Invoices to "mux". +// UnaryRPC :call InvoicesServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +func RegisterInvoicesHandlerServer(ctx context.Context, mux *runtime.ServeMux, server InvoicesServer) error { + + mux.Handle("GET", pattern_Invoices_SubscribeSingleInvoice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_Invoices_CancelInvoice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Invoices_CancelInvoice_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Invoices_CancelInvoice_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Invoices_AddHoldInvoice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Invoices_AddHoldInvoice_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Invoices_AddHoldInvoice_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Invoices_SettleInvoice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Invoices_SettleInvoice_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Invoices_SettleInvoice_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterInvoicesHandlerFromEndpoint is same as RegisterInvoicesHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterInvoicesHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterInvoicesHandler(ctx, mux, conn) +} + +// RegisterInvoicesHandler registers the http handlers for service Invoices to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterInvoicesHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterInvoicesHandlerClient(ctx, mux, NewInvoicesClient(conn)) +} + +// RegisterInvoicesHandlerClient registers the http handlers for service Invoices +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "InvoicesClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "InvoicesClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "InvoicesClient" to call the correct interceptors. +func RegisterInvoicesHandlerClient(ctx context.Context, mux *runtime.ServeMux, client InvoicesClient) error { + + mux.Handle("GET", pattern_Invoices_SubscribeSingleInvoice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Invoices_SubscribeSingleInvoice_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Invoices_SubscribeSingleInvoice_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Invoices_CancelInvoice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Invoices_CancelInvoice_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Invoices_CancelInvoice_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Invoices_AddHoldInvoice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Invoices_AddHoldInvoice_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Invoices_AddHoldInvoice_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Invoices_SettleInvoice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Invoices_SettleInvoice_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Invoices_SettleInvoice_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Invoices_SubscribeSingleInvoice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "invoices", "subscribe", "r_hash"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Invoices_CancelInvoice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "invoices", "cancel"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Invoices_AddHoldInvoice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "invoices", "hodl"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Invoices_SettleInvoice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "invoices", "settle"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_Invoices_SubscribeSingleInvoice_0 = runtime.ForwardResponseStream + + forward_Invoices_CancelInvoice_0 = runtime.ForwardResponseMessage + + forward_Invoices_AddHoldInvoice_0 = runtime.ForwardResponseMessage + + forward_Invoices_SettleInvoice_0 = runtime.ForwardResponseMessage +) diff --git a/lnrpc/invoicesrpc/invoices.proto b/lnrpc/invoicesrpc/invoices.proto index 17745c00af..df52b8c82f 100644 --- a/lnrpc/invoicesrpc/invoices.proto +++ b/lnrpc/invoicesrpc/invoices.proto @@ -1,6 +1,5 @@ syntax = "proto3"; -import "google/api/annotations.proto"; import "rpc.proto"; package invoicesrpc; diff --git a/lnrpc/invoicesrpc/invoices.swagger.json b/lnrpc/invoicesrpc/invoices.swagger.json index 2c34a38ff8..e6d42a85e0 100644 --- a/lnrpc/invoicesrpc/invoices.swagger.json +++ b/lnrpc/invoicesrpc/invoices.swagger.json @@ -4,17 +4,155 @@ "title": "invoicesrpc/invoices.proto", "version": "version not set" }, - "schemes": [ - "http", - "https" - ], "consumes": [ "application/json" ], "produces": [ "application/json" ], - "paths": {}, + "paths": { + "/v2/invoices/cancel": { + "post": { + "summary": "CancelInvoice cancels a currently open invoice. If the invoice is already\ncanceled, this call will succeed. If the invoice is already settled, it will\nfail.", + "operationId": "CancelInvoice", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/invoicesrpcCancelInvoiceResp" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/invoicesrpcCancelInvoiceMsg" + } + } + ], + "tags": [ + "Invoices" + ] + } + }, + "/v2/invoices/hodl": { + "post": { + "summary": "AddHoldInvoice creates a hold invoice. It ties the invoice to the hash\nsupplied in the request.", + "operationId": "AddHoldInvoice", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/invoicesrpcAddHoldInvoiceResp" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/invoicesrpcAddHoldInvoiceRequest" + } + } + ], + "tags": [ + "Invoices" + ] + } + }, + "/v2/invoices/settle": { + "post": { + "summary": "SettleInvoice settles an accepted invoice. If the invoice is already\nsettled, this call will succeed.", + "operationId": "SettleInvoice", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/invoicesrpcSettleInvoiceResp" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/invoicesrpcSettleInvoiceMsg" + } + } + ], + "tags": [ + "Invoices" + ] + } + }, + "/v2/invoices/subscribe/{r_hash}": { + "get": { + "summary": "SubscribeSingleInvoice returns a uni-directional stream (server -\u003e client)\nto notify the client of state transitions of the specified invoice.\nInitially the current invoice state is always sent out.", + "operationId": "SubscribeSingleInvoice", + "responses": { + "200": { + "description": "A successful response.(streaming responses)", + "schema": { + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/lnrpcInvoice" + }, + "error": { + "$ref": "#/definitions/runtimeStreamError" + } + }, + "title": "Stream result of lnrpcInvoice" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "r_hash", + "description": "Hash corresponding to the (hold) invoice to subscribe to.", + "in": "path", + "required": true, + "type": "string", + "format": "byte" + } + ], + "tags": [ + "Invoices" + ] + } + } + }, "definitions": { "InvoiceInvoiceState": { "type": "string", @@ -26,6 +164,63 @@ ], "default": "OPEN" }, + "invoicesrpcAddHoldInvoiceRequest": { + "type": "object", + "properties": { + "memo": { + "type": "string", + "description": "An optional memo to attach along with the invoice. Used for record keeping\npurposes for the invoice's creator, and will also be set in the description\nfield of the encoded payment request if the description_hash field is not\nbeing used." + }, + "hash": { + "type": "string", + "format": "byte", + "title": "The hash of the preimage" + }, + "value": { + "type": "string", + "format": "int64", + "description": "The fields value and value_msat are mutually exclusive.", + "title": "The value of this invoice in satoshis" + }, + "value_msat": { + "type": "string", + "format": "int64", + "description": "The fields value and value_msat are mutually exclusive.", + "title": "The value of this invoice in millisatoshis" + }, + "description_hash": { + "type": "string", + "format": "byte", + "description": "Hash (SHA-256) of a description of the payment. Used if the description of\npayment (memo) is too long to naturally fit within the description field\nof an encoded payment request." + }, + "expiry": { + "type": "string", + "format": "int64", + "description": "Payment request expiry time in seconds. Default is 3600 (1 hour)." + }, + "fallback_addr": { + "type": "string", + "description": "Fallback on-chain address." + }, + "cltv_expiry": { + "type": "string", + "format": "uint64", + "description": "Delta to use for the time-lock of the CLTV extended to the final hop." + }, + "route_hints": { + "type": "array", + "items": { + "$ref": "#/definitions/lnrpcRouteHint" + }, + "description": "Route hints that can each be individually used to assist in reaching the\ninvoice's destination." + }, + "private": { + "type": "boolean", + "format": "boolean", + "description": "Whether this invoice should include routing hints for private channels." + } + } + }, "invoicesrpcAddHoldInvoiceResp": { "type": "object", "properties": { @@ -35,9 +230,29 @@ } } }, + "invoicesrpcCancelInvoiceMsg": { + "type": "object", + "properties": { + "payment_hash": { + "type": "string", + "format": "byte", + "description": "Hash corresponding to the (hold) invoice to cancel." + } + } + }, "invoicesrpcCancelInvoiceResp": { "type": "object" }, + "invoicesrpcSettleInvoiceMsg": { + "type": "object", + "properties": { + "preimage": { + "type": "string", + "format": "byte", + "description": "Externally discovered pre-image that should be used to settle the hold\ninvoice." + } + } + }, "invoicesrpcSettleInvoiceResp": { "type": "object" }, @@ -306,6 +521,27 @@ } } }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } + }, "runtimeStreamError": { "type": "object", "properties": { @@ -331,19 +567,5 @@ } } } - }, - "x-stream-definitions": { - "lnrpcInvoice": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/lnrpcInvoice" - }, - "error": { - "$ref": "#/definitions/runtimeStreamError" - } - }, - "title": "Stream result of lnrpcInvoice" - } } } diff --git a/lnrpc/invoicesrpc/invoices_server.go b/lnrpc/invoicesrpc/invoices_server.go index 3d840a5bae..75c9b7c665 100644 --- a/lnrpc/invoicesrpc/invoices_server.go +++ b/lnrpc/invoicesrpc/invoices_server.go @@ -11,6 +11,7 @@ import ( "google.golang.org/grpc" "gopkg.in/macaroon-bakery.v2/bakery" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lntypes" @@ -164,6 +165,28 @@ func (s *Server) RegisterWithRootServer(grpcServer *grpc.Server) error { return nil } +// RegisterWithRestServer will be called by the root REST mux to direct a sub +// RPC server to register itself with the main REST mux server. Until this is +// called, each sub-server won't be able to have requests routed towards it. +// +// NOTE: This is part of the lnrpc.SubServer interface. +func (s *Server) RegisterWithRestServer(ctx context.Context, + mux *runtime.ServeMux, dest string, opts []grpc.DialOption) error { + + // We make sure that we register it with the main REST server to ensure + // all our methods are routed properly. + err := RegisterInvoicesHandlerFromEndpoint(ctx, mux, dest, opts) + if err != nil { + log.Errorf("Could not register Invoices REST server "+ + "with root REST server: %v", err) + return err + } + + log.Debugf("Invoices REST server successfully registered with " + + "root REST server") + return nil +} + // SubscribeSingleInvoice returns a uni-directional stream (server -> client) // for notifying the client of state changes for a specified invoice. func (s *Server) SubscribeSingleInvoice(req *SubscribeSingleInvoiceRequest, diff --git a/lnrpc/lnclipb/lncli.swagger.json b/lnrpc/lnclipb/lncli.swagger.json index 043d7bc589..eb88452f0e 100644 --- a/lnrpc/lnclipb/lncli.swagger.json +++ b/lnrpc/lnclipb/lncli.swagger.json @@ -4,10 +4,6 @@ "title": "lnclipb/lncli.proto", "version": "version not set" }, - "schemes": [ - "http", - "https" - ], "consumes": [ "application/json" ], @@ -15,5 +11,39 @@ "application/json" ], "paths": {}, - "definitions": {} + "definitions": { + "protobufAny": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } + } + } } diff --git a/lnrpc/rest-annotations.yaml b/lnrpc/rest-annotations.yaml new file mode 100644 index 0000000000..9ebed0fbd8 --- /dev/null +++ b/lnrpc/rest-annotations.yaml @@ -0,0 +1,290 @@ +type: google.api.Service +config_version: 3 + +http: + rules: + # rpc.proto + - selector: lnrpc.Lightning.WalletBalance + get: "/v1/balance/blockchain" + - selector: lnrpc.Lightning.ChannelBalance + get: "/v1/balance/channels" + - selector: lnrpc.Lightning.GetTransactions + get: "/v1/transactions" + - selector: lnrpc.Lightning.EstimateFee + get: "/v1/transactions/fee" + - selector: lnrpc.Lightning.SendCoins + post: "/v1/transactions" + body: "*" + - selector: lnrpc.Lightning.ListUnspent + get: "/v1/utxos" + - selector: lnrpc.Lightning.SubscribeTransactions + get: "/v1/transactions/subscribe" + - selector: lnrpc.Lightning.SendMany + post: "/v1/transactions/many" + body: "*" + - selector: lnrpc.Lightning.NewAddress + get: "/v1/newaddress" + - selector: lnrpc.Lightning.SignMessage + post: "/v1/signmessage" + body: "*" + - selector: lnrpc.Lightning.VerifyMessage + post: "/v1/verifymessage" + body: "*" + - selector: lnrpc.Lightning.ConnectPeer + post: "/v1/peers" + body: "*" + - selector: lnrpc.Lightning.DisconnectPeer + delete: "/v1/peers/{pub_key}" + - selector: lnrpc.Lightning.ListPeers + get: "/v1/peers" + - selector: lnrpc.Lightning.SubscribePeerEvents + get: "/v1/peers/subscribe" + - selector: lnrpc.Lightning.GetInfo + get: "/v1/getinfo" + - selector: lnrpc.Lightning.PendingChannels + get: "/v1/channels/pending" + - selector: lnrpc.Lightning.ListChannels + get: "/v1/channels" + - selector: lnrpc.Lightning.SubscribeChannelEvents + get: "/v1/channels/subscribe" + - selector: lnrpc.Lightning.ClosedChannels + get: "/v1/channels/closed" + - selector: lnrpc.Lightning.OpenChannelSync + post: "/v1/channels" + body: "*" + - selector: lnrpc.Lightning.OpenChannel + post: "/v1/channels/stream" + body: "*" + - selector: lnrpc.Lightning.FundingStateStep + post: "/v1/funding/step" + body: "*" + - selector: lnrpc.Lightning.ChannelAcceptor + # request streaming RPC, REST not supported + - selector: lnrpc.Lightning.CloseChannel + delete: "/v1/channels/{channel_point.funding_txid_str}/{channel_point.output_index}" + - selector: lnrpc.Lightning.AbandonChannel + delete: "/v1/channels/abandon/{channel_point.funding_txid_str}/{channel_point.output_index}" + - selector: lnrpc.Lightning.SendPayment + - selector: lnrpc.Lightning.SendPaymentSync + post: "/v1/channels/transactions" + body: "*" + - selector: lnrpc.Lightning.SendToRoute + # deprecated, no REST endpoint + - selector: lnrpc.Lightning.SendToRouteSync + post: "/v1/channels/transactions/route" + body: "*" + - selector: lnrpc.Lightning.AddInvoice + post: "/v1/invoices" + body: "*" + - selector: lnrpc.Lightning.ListInvoices + get: "/v1/invoices" + - selector: lnrpc.Lightning.LookupInvoice + get: "/v1/invoice/{r_hash_str}" + - selector: lnrpc.Lightning.SubscribeInvoices + get: "/v1/invoices/subscribe" + - selector: lnrpc.Lightning.DecodePayReq + get: "/v1/payreq/{pay_req}" + - selector: lnrpc.Lightning.ListPayments + get: "/v1/payments" + - selector: lnrpc.Lightning.DeleteAllPayments + delete: "/v1/payments" + - selector: lnrpc.Lightning.DescribeGraph + get: "/v1/graph" + - selector: lnrpc.Lightning.GetNodeMetrics + get: "/v1/graph/nodemetrics" + - selector: lnrpc.Lightning.GetChanInfo + get: "/v1/graph/edge/{chan_id}" + - selector: lnrpc.Lightning.GetNodeInfo + get: "/v1/graph/node/{pub_key}" + - selector: lnrpc.Lightning.QueryRoutes + get: "/v1/graph/routes/{pub_key}/{amt}" + - selector: lnrpc.Lightning.GetNetworkInfo + get: "/v1/graph/info" + - selector: lnrpc.Lightning.StopDaemon + post: "/v1/stop" + body: "*" + - selector: lnrpc.Lightning.SubscribeChannelGraph + get: "/v1/graph/subscribe" + - selector: lnrpc.Lightning.DebugLevel + post: "/v1/debuglevel" + body: "*" + - selector: lnrpc.Lightning.FeeReport + get: "/v1/fees" + - selector: lnrpc.Lightning.UpdateChannelPolicy + post: "/v1/chanpolicy" + body: "*" + - selector: lnrpc.Lightning.ForwardingHistory + post: "/v1/switch" + body: "*" + - selector: lnrpc.Lightning.ExportChannelBackup + get: "/v1/channels/backup/{chan_point.funding_txid_str}/{chan_point.output_index}" + - selector: lnrpc.Lightning.ExportAllChannelBackups + get: "/v1/channels/backup" + - selector: lnrpc.Lightning.VerifyChanBackup + post: "/v1/channels/backup/verify" + body: "*" + - selector: lnrpc.Lightning.RestoreChannelBackups + post: "/v1/channels/backup/restore" + body: "*" + - selector: lnrpc.Lightning.SubscribeChannelBackups + get: "/v1/channels/backup/subscribe" + - selector: lnrpc.Lightning.BakeMacaroon + post: "/v1/macaroon" + body: "*" + + # walletunlocker.proto + - selector: lnrpc.WalletUnlocker.GenSeed + get: "/v1/genseed" + - selector: lnrpc.WalletUnlocker.InitWallet + post: "/v1/initwallet" + body: "*" + - selector: lnrpc.WalletUnlocker.UnlockWallet + post: "/v1/unlockwallet" + body: "*" + - selector: lnrpc.WalletUnlocker.ChangePassword + post: "/v1/changepassword" + body: "*" + + # autopilotrpc/autopilot.proto + - selector: autopilotrpc.Autopilot.Status + get: "/v2/autopilot/status" + - selector: autopilotrpc.Autopilot.ModifyStatus + post: "/v2/autopilot/modify" + body: "*" + - selector: autopilotrpc.Autopilot.QueryScores + get: "/v2/autopilot/scores" + - selector: autopilotrpc.Autopilot.SetScores + post: "/v2/autopilot/scores" + body: "*" + + # chainrpc/chainnotifier.proto + - selector: chainrpc.ChainNotifier.RegisterConfirmationsNtfn + post: "/v2/chainnotifier/register/confirmations" + body: "*" + - selector: chainrpc.ChainNotifier.RegisterSpendNtfn + post: "/v2/chainnotifier/register/spends" + body: "*" + - selector: chainrpc.ChainNotifier.RegisterBlockEpochNtfn + post: "/v2/chainnotifier/register/blocks" + body: "*" + + # invoicesrpc/invoices.proto + - selector: invoicesrpc.Invoices.SubscribeSingleInvoice + get: "/v2/invoices/subscribe/{r_hash}" + - selector: invoicesrpc.Invoices.CancelInvoice + post: "/v2/invoices/cancel" + body: "*" + - selector: invoicesrpc.Invoices.AddHoldInvoice + post: "/v2/invoices/hodl" + body: "*" + - selector: invoicesrpc.Invoices.SettleInvoice + post: "/v2/invoices/settle" + body: "*" + + # routerrpc/router.proto + - selector: routerrpc.Router.SendPaymentV2 + post: "/v2/router/send" + body: "*" + - selector: routerrpc.Router.TrackPaymentV2 + get: "/v2/router/track/{payment_hash}" + - selector: routerrpc.Router.EstimateRouteFee + post: "/v2/router/route/estimatefee" + body: "*" + - selector: routerrpc.Router.SendToRoute + # deprecated, no REST endpoint + - selector: routerrpc.Router.SendToRouteV2 + post: "/v2/router/route/send" + body: "*" + - selector: routerrpc.Router.ResetMissionControl + post: "/v2/router/mc/reset" + body: "*" + - selector: routerrpc.Router.QueryMissionControl + get: "/v2/router/mc" + - selector: routerrpc.Router.QueryProbability + get: "/v2/router/mc/probability/{from_node}/{to_node}/{amt_msat}" + - selector: routerrpc.Router.BuildRoute + post: "/v2/router/route" + body: "*" + - selector: routerrpc.Router.SubscribeHtlcEvents + get: "/v2/router/htlcevents" + - selector: routerrpc.Router.SendPayment + # deprecated, no REST endpoint + - selector: routerrpc.Router.TrackPayment + # deprecated, no REST endpoint + + # signrpc/signer.proto + - selector: signrpc.Signer.SignOutputRaw + post: "/v2/signer/signraw" + body: "*" + - selector: signrpc.Signer.ComputeInputScript + post: "/v2/signer/inputscript" + body: "*" + - selector: signrpc.Signer.SignMessage + post: "/v2/signer/signmessage" + body: "*" + - selector: signrpc.Signer.VerifyMessage + post: "/v2/signer/verifymessage" + body: "*" + - selector: signrpc.Signer.DeriveSharedKey + post: "/v2/signer/sharedkey" + body: "*" + + # verrpc/verrpc.proto + - selector: verrpc.Versioner.GetVersion + get: "/v2/versioner/version" + + # walletrpc/walletkit.proto + - selector: walletrpc.WalletKit.ListUnspent + post: "/v2/wallet/utxos" + - selector: walletrpc.WalletKit.LeaseOutput + post: "/v2/wallet/utxos/lease" + body: "*" + - selector: walletrpc.WalletKit.ReleaseOutput + post: "/v2/wallet/utxos/release" + body: "*" + - selector: walletrpc.WalletKit.DeriveNextKey + post: "/v2/wallet/key/next" + body: "*" + - selector: walletrpc.WalletKit.DeriveKey + post: "/v2/wallet/key" + body: "*" + - selector: walletrpc.WalletKit.NextAddr + post: "/v2/wallet/address/next" + body: "*" + - selector: walletrpc.WalletKit.PublishTransaction + post: "/v2/wallet/tx" + body: "*" + - selector: walletrpc.WalletKit.SendOutputs + post: "/v2/wallet/send" + body: "*" + - selector: walletrpc.WalletKit.EstimateFee + get: "/v2/wallet/estimatefee/{conf_target}" + - selector: walletrpc.WalletKit.PendingSweeps + get: "/v2/wallet/sweeps/pending" + - selector: walletrpc.WalletKit.BumpFee + post: "/v2/wallet/bumpfee" + body: "*" + - selector: walletrpc.WalletKit.ListSweeps + get: "/v2/wallet/sweeps" + - selector: walletrpc.WalletKit.LabelTransaction + post: "/v2/wallet/tx/label" + body: "*" + + # watchtowerrpc/watchtower.proto + - selector: watchtowerrpc.Watchtower.GetInfo + get: "/v2/watchtower/server" + + # wtclientrpc/wtclient.proto + - selector: wtclientrpc.WatchtowerClient.AddTower + post: "/v2/watchtower/client" + body: "*" + - selector: wtclientrpc.WatchtowerClient.RemoveTower + delete: "/v2/watchtower/client/{pubkey}" + - selector: wtclientrpc.WatchtowerClient.ListTowers + get: "/v2/watchtower/client" + - selector: wtclientrpc.WatchtowerClient.GetTowerInfo + get: "/v2/watchtower/client/info/{pubkey}" + - selector: wtclientrpc.WatchtowerClient.Stats + get: "/v2/watchtower/client/stats" + - selector: wtclientrpc.WatchtowerClient.Policy + get: "/v2/watchtower/client/policy" diff --git a/lnrpc/routerrpc/router.pb.go b/lnrpc/routerrpc/router.pb.go index c33c8f1542..2911f7322b 100644 --- a/lnrpc/routerrpc/router.pb.go +++ b/lnrpc/routerrpc/router.pb.go @@ -9,6 +9,8 @@ import ( proto "github.com/golang/protobuf/proto" lnrpc "github.com/lightningnetwork/lnd/lnrpc" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" math "math" ) @@ -1938,9 +1940,10 @@ type RouterClient interface { //SendToRouteV2 in that it doesn't return the full HTLC information. SendToRoute(ctx context.Context, in *SendToRouteRequest, opts ...grpc.CallOption) (*SendToRouteResponse, error) // - //SendToRouteV2 attempts to make a payment via the specified route. This method - //differs from SendPayment in that it allows users to specify a full route - //manually. This can be used for things like rebalancing, and atomic swaps. + //SendToRouteV2 attempts to make a payment via the specified route. This + //method differs from SendPayment in that it allows users to specify a full + //route manually. This can be used for things like rebalancing, and atomic + //swaps. SendToRouteV2(ctx context.Context, in *SendToRouteRequest, opts ...grpc.CallOption) (*lnrpc.HTLCAttempt, error) // //ResetMissionControl clears all mission control state and starts with a clean @@ -2231,9 +2234,10 @@ type RouterServer interface { //SendToRouteV2 in that it doesn't return the full HTLC information. SendToRoute(context.Context, *SendToRouteRequest) (*SendToRouteResponse, error) // - //SendToRouteV2 attempts to make a payment via the specified route. This method - //differs from SendPayment in that it allows users to specify a full route - //manually. This can be used for things like rebalancing, and atomic swaps. + //SendToRouteV2 attempts to make a payment via the specified route. This + //method differs from SendPayment in that it allows users to specify a full + //route manually. This can be used for things like rebalancing, and atomic + //swaps. SendToRouteV2(context.Context, *SendToRouteRequest) (*lnrpc.HTLCAttempt, error) // //ResetMissionControl clears all mission control state and starts with a clean @@ -2267,6 +2271,47 @@ type RouterServer interface { TrackPayment(*TrackPaymentRequest, Router_TrackPaymentServer) error } +// UnimplementedRouterServer can be embedded to have forward compatible implementations. +type UnimplementedRouterServer struct { +} + +func (*UnimplementedRouterServer) SendPaymentV2(req *SendPaymentRequest, srv Router_SendPaymentV2Server) error { + return status.Errorf(codes.Unimplemented, "method SendPaymentV2 not implemented") +} +func (*UnimplementedRouterServer) TrackPaymentV2(req *TrackPaymentRequest, srv Router_TrackPaymentV2Server) error { + return status.Errorf(codes.Unimplemented, "method TrackPaymentV2 not implemented") +} +func (*UnimplementedRouterServer) EstimateRouteFee(ctx context.Context, req *RouteFeeRequest) (*RouteFeeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EstimateRouteFee not implemented") +} +func (*UnimplementedRouterServer) SendToRoute(ctx context.Context, req *SendToRouteRequest) (*SendToRouteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SendToRoute not implemented") +} +func (*UnimplementedRouterServer) SendToRouteV2(ctx context.Context, req *SendToRouteRequest) (*lnrpc.HTLCAttempt, error) { + return nil, status.Errorf(codes.Unimplemented, "method SendToRouteV2 not implemented") +} +func (*UnimplementedRouterServer) ResetMissionControl(ctx context.Context, req *ResetMissionControlRequest) (*ResetMissionControlResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ResetMissionControl not implemented") +} +func (*UnimplementedRouterServer) QueryMissionControl(ctx context.Context, req *QueryMissionControlRequest) (*QueryMissionControlResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryMissionControl not implemented") +} +func (*UnimplementedRouterServer) QueryProbability(ctx context.Context, req *QueryProbabilityRequest) (*QueryProbabilityResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryProbability not implemented") +} +func (*UnimplementedRouterServer) BuildRoute(ctx context.Context, req *BuildRouteRequest) (*BuildRouteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method BuildRoute not implemented") +} +func (*UnimplementedRouterServer) SubscribeHtlcEvents(req *SubscribeHtlcEventsRequest, srv Router_SubscribeHtlcEventsServer) error { + return status.Errorf(codes.Unimplemented, "method SubscribeHtlcEvents not implemented") +} +func (*UnimplementedRouterServer) SendPayment(req *SendPaymentRequest, srv Router_SendPaymentServer) error { + return status.Errorf(codes.Unimplemented, "method SendPayment not implemented") +} +func (*UnimplementedRouterServer) TrackPayment(req *TrackPaymentRequest, srv Router_TrackPaymentServer) error { + return status.Errorf(codes.Unimplemented, "method TrackPayment not implemented") +} + func RegisterRouterServer(s *grpc.Server, srv RouterServer) { s.RegisterService(&_Router_serviceDesc, srv) } diff --git a/lnrpc/routerrpc/router.pb.gw.go b/lnrpc/routerrpc/router.pb.gw.go new file mode 100644 index 0000000000..2335031190 --- /dev/null +++ b/lnrpc/routerrpc/router.pb.gw.go @@ -0,0 +1,782 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: routerrpc/router.proto + +/* +Package routerrpc is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package routerrpc + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage + +func request_Router_SendPaymentV2_0(ctx context.Context, marshaler runtime.Marshaler, client RouterClient, req *http.Request, pathParams map[string]string) (Router_SendPaymentV2Client, runtime.ServerMetadata, error) { + var protoReq SendPaymentRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.SendPaymentV2(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +var ( + filter_Router_TrackPaymentV2_0 = &utilities.DoubleArray{Encoding: map[string]int{"payment_hash": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_Router_TrackPaymentV2_0(ctx context.Context, marshaler runtime.Marshaler, client RouterClient, req *http.Request, pathParams map[string]string) (Router_TrackPaymentV2Client, runtime.ServerMetadata, error) { + var protoReq TrackPaymentRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["payment_hash"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "payment_hash") + } + + protoReq.PaymentHash, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "payment_hash", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Router_TrackPaymentV2_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.TrackPaymentV2(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_Router_EstimateRouteFee_0(ctx context.Context, marshaler runtime.Marshaler, client RouterClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RouteFeeRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.EstimateRouteFee(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Router_EstimateRouteFee_0(ctx context.Context, marshaler runtime.Marshaler, server RouterServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RouteFeeRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.EstimateRouteFee(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Router_SendToRouteV2_0(ctx context.Context, marshaler runtime.Marshaler, client RouterClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SendToRouteRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.SendToRouteV2(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Router_SendToRouteV2_0(ctx context.Context, marshaler runtime.Marshaler, server RouterServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SendToRouteRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SendToRouteV2(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Router_ResetMissionControl_0(ctx context.Context, marshaler runtime.Marshaler, client RouterClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ResetMissionControlRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ResetMissionControl(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Router_ResetMissionControl_0(ctx context.Context, marshaler runtime.Marshaler, server RouterServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ResetMissionControlRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ResetMissionControl(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Router_QueryMissionControl_0(ctx context.Context, marshaler runtime.Marshaler, client RouterClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryMissionControlRequest + var metadata runtime.ServerMetadata + + msg, err := client.QueryMissionControl(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Router_QueryMissionControl_0(ctx context.Context, marshaler runtime.Marshaler, server RouterServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryMissionControlRequest + var metadata runtime.ServerMetadata + + msg, err := server.QueryMissionControl(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Router_QueryProbability_0(ctx context.Context, marshaler runtime.Marshaler, client RouterClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryProbabilityRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["from_node"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "from_node") + } + + protoReq.FromNode, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "from_node", err) + } + + val, ok = pathParams["to_node"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "to_node") + } + + protoReq.ToNode, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "to_node", err) + } + + val, ok = pathParams["amt_msat"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "amt_msat") + } + + protoReq.AmtMsat, err = runtime.Int64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "amt_msat", err) + } + + msg, err := client.QueryProbability(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Router_QueryProbability_0(ctx context.Context, marshaler runtime.Marshaler, server RouterServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryProbabilityRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["from_node"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "from_node") + } + + protoReq.FromNode, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "from_node", err) + } + + val, ok = pathParams["to_node"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "to_node") + } + + protoReq.ToNode, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "to_node", err) + } + + val, ok = pathParams["amt_msat"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "amt_msat") + } + + protoReq.AmtMsat, err = runtime.Int64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "amt_msat", err) + } + + msg, err := server.QueryProbability(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Router_BuildRoute_0(ctx context.Context, marshaler runtime.Marshaler, client RouterClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq BuildRouteRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.BuildRoute(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Router_BuildRoute_0(ctx context.Context, marshaler runtime.Marshaler, server RouterServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq BuildRouteRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.BuildRoute(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Router_SubscribeHtlcEvents_0(ctx context.Context, marshaler runtime.Marshaler, client RouterClient, req *http.Request, pathParams map[string]string) (Router_SubscribeHtlcEventsClient, runtime.ServerMetadata, error) { + var protoReq SubscribeHtlcEventsRequest + var metadata runtime.ServerMetadata + + stream, err := client.SubscribeHtlcEvents(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +// RegisterRouterHandlerServer registers the http handlers for service Router to "mux". +// UnaryRPC :call RouterServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +func RegisterRouterHandlerServer(ctx context.Context, mux *runtime.ServeMux, server RouterServer) error { + + mux.Handle("POST", pattern_Router_SendPaymentV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("GET", pattern_Router_TrackPaymentV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_Router_EstimateRouteFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Router_EstimateRouteFee_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Router_EstimateRouteFee_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Router_SendToRouteV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Router_SendToRouteV2_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Router_SendToRouteV2_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Router_ResetMissionControl_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Router_ResetMissionControl_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Router_ResetMissionControl_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Router_QueryMissionControl_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Router_QueryMissionControl_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Router_QueryMissionControl_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Router_QueryProbability_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Router_QueryProbability_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Router_QueryProbability_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Router_BuildRoute_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Router_BuildRoute_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Router_BuildRoute_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Router_SubscribeHtlcEvents_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + return nil +} + +// RegisterRouterHandlerFromEndpoint is same as RegisterRouterHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterRouterHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterRouterHandler(ctx, mux, conn) +} + +// RegisterRouterHandler registers the http handlers for service Router to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterRouterHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterRouterHandlerClient(ctx, mux, NewRouterClient(conn)) +} + +// RegisterRouterHandlerClient registers the http handlers for service Router +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "RouterClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "RouterClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "RouterClient" to call the correct interceptors. +func RegisterRouterHandlerClient(ctx context.Context, mux *runtime.ServeMux, client RouterClient) error { + + mux.Handle("POST", pattern_Router_SendPaymentV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Router_SendPaymentV2_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Router_SendPaymentV2_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Router_TrackPaymentV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Router_TrackPaymentV2_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Router_TrackPaymentV2_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Router_EstimateRouteFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Router_EstimateRouteFee_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Router_EstimateRouteFee_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Router_SendToRouteV2_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Router_SendToRouteV2_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Router_SendToRouteV2_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Router_ResetMissionControl_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Router_ResetMissionControl_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Router_ResetMissionControl_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Router_QueryMissionControl_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Router_QueryMissionControl_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Router_QueryMissionControl_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Router_QueryProbability_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Router_QueryProbability_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Router_QueryProbability_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Router_BuildRoute_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Router_BuildRoute_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Router_BuildRoute_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Router_SubscribeHtlcEvents_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Router_SubscribeHtlcEvents_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Router_SubscribeHtlcEvents_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Router_SendPaymentV2_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "router", "send"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Router_TrackPaymentV2_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "router", "track", "payment_hash"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Router_EstimateRouteFee_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "router", "route", "estimatefee"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Router_SendToRouteV2_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "router", "route", "send"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Router_ResetMissionControl_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "router", "mc", "reset"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Router_QueryMissionControl_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "router", "mc"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Router_QueryProbability_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 1, 0, 4, 1, 5, 5, 1, 0, 4, 1, 5, 6}, []string{"v2", "router", "mc", "probability", "from_node", "to_node", "amt_msat"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Router_BuildRoute_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "router", "route"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Router_SubscribeHtlcEvents_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "router", "htlcevents"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_Router_SendPaymentV2_0 = runtime.ForwardResponseStream + + forward_Router_TrackPaymentV2_0 = runtime.ForwardResponseStream + + forward_Router_EstimateRouteFee_0 = runtime.ForwardResponseMessage + + forward_Router_SendToRouteV2_0 = runtime.ForwardResponseMessage + + forward_Router_ResetMissionControl_0 = runtime.ForwardResponseMessage + + forward_Router_QueryMissionControl_0 = runtime.ForwardResponseMessage + + forward_Router_QueryProbability_0 = runtime.ForwardResponseMessage + + forward_Router_BuildRoute_0 = runtime.ForwardResponseMessage + + forward_Router_SubscribeHtlcEvents_0 = runtime.ForwardResponseStream +) diff --git a/lnrpc/routerrpc/router.proto b/lnrpc/routerrpc/router.proto index 25bc765ab1..44a9e4c607 100644 --- a/lnrpc/routerrpc/router.proto +++ b/lnrpc/routerrpc/router.proto @@ -40,9 +40,10 @@ service Router { } /* - SendToRouteV2 attempts to make a payment via the specified route. This method - differs from SendPayment in that it allows users to specify a full route - manually. This can be used for things like rebalancing, and atomic swaps. + SendToRouteV2 attempts to make a payment via the specified route. This + method differs from SendPayment in that it allows users to specify a full + route manually. This can be used for things like rebalancing, and atomic + swaps. */ rpc SendToRouteV2 (SendToRouteRequest) returns (lnrpc.HTLCAttempt); @@ -82,7 +83,7 @@ service Router { returns (stream HtlcEvent); /* - Deprecated, use SendPaymentV2. SendPayment attempts to route a payment + Deprecated, use SendPaymentV2. SendPayment attempts to route a payment described by the passed PaymentRequest to the final destination. The call returns a stream of payment status updates. */ @@ -578,4 +579,3 @@ message PaymentStatus { */ repeated lnrpc.HTLCAttempt htlcs = 4; } - diff --git a/lnrpc/routerrpc/router.swagger.json b/lnrpc/routerrpc/router.swagger.json index 0552bf2ef5..dd196dbbab 100644 --- a/lnrpc/routerrpc/router.swagger.json +++ b/lnrpc/routerrpc/router.swagger.json @@ -4,17 +4,342 @@ "title": "routerrpc/router.proto", "version": "version not set" }, - "schemes": [ - "http", - "https" - ], "consumes": [ "application/json" ], "produces": [ "application/json" ], - "paths": {}, + "paths": { + "/v2/router/htlcevents": { + "get": { + "summary": "SubscribeHtlcEvents creates a uni-directional stream from the server to\nthe client which delivers a stream of htlc events.", + "operationId": "SubscribeHtlcEvents", + "responses": { + "200": { + "description": "A successful response.(streaming responses)", + "schema": { + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/routerrpcHtlcEvent" + }, + "error": { + "$ref": "#/definitions/runtimeStreamError" + } + }, + "title": "Stream result of routerrpcHtlcEvent" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "Router" + ] + } + }, + "/v2/router/mc": { + "get": { + "summary": "QueryMissionControl exposes the internal mission control state to callers.\nIt is a development feature.", + "operationId": "QueryMissionControl", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/routerrpcQueryMissionControlResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "Router" + ] + } + }, + "/v2/router/mc/probability/{from_node}/{to_node}/{amt_msat}": { + "get": { + "summary": "QueryProbability returns the current success probability estimate for a\ngiven node pair and amount.", + "operationId": "QueryProbability", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/routerrpcQueryProbabilityResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "from_node", + "description": "The source node pubkey of the pair.", + "in": "path", + "required": true, + "type": "string", + "format": "byte" + }, + { + "name": "to_node", + "description": "The destination node pubkey of the pair.", + "in": "path", + "required": true, + "type": "string", + "format": "byte" + }, + { + "name": "amt_msat", + "description": "The amount for which to calculate a probability.", + "in": "path", + "required": true, + "type": "string", + "format": "int64" + } + ], + "tags": [ + "Router" + ] + } + }, + "/v2/router/mc/reset": { + "post": { + "summary": "ResetMissionControl clears all mission control state and starts with a clean\nslate.", + "operationId": "ResetMissionControl", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/routerrpcResetMissionControlResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/routerrpcResetMissionControlRequest" + } + } + ], + "tags": [ + "Router" + ] + } + }, + "/v2/router/route": { + "post": { + "summary": "BuildRoute builds a fully specified route based on a list of hop public\nkeys. It retrieves the relevant channel policies from the graph in order to\ncalculate the correct fees and time locks.", + "operationId": "BuildRoute", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/routerrpcBuildRouteResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/routerrpcBuildRouteRequest" + } + } + ], + "tags": [ + "Router" + ] + } + }, + "/v2/router/route/estimatefee": { + "post": { + "summary": "EstimateRouteFee allows callers to obtain a lower bound w.r.t how much it\nmay cost to send an HTLC to the target end destination.", + "operationId": "EstimateRouteFee", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/routerrpcRouteFeeResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/routerrpcRouteFeeRequest" + } + } + ], + "tags": [ + "Router" + ] + } + }, + "/v2/router/route/send": { + "post": { + "summary": "SendToRouteV2 attempts to make a payment via the specified route. This\nmethod differs from SendPayment in that it allows users to specify a full\nroute manually. This can be used for things like rebalancing, and atomic\nswaps.", + "operationId": "SendToRouteV2", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/lnrpcHTLCAttempt" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/routerrpcSendToRouteRequest" + } + } + ], + "tags": [ + "Router" + ] + } + }, + "/v2/router/send": { + "post": { + "summary": "SendPaymentV2 attempts to route a payment described by the passed\nPaymentRequest to the final destination. The call returns a stream of\npayment updates.", + "operationId": "SendPaymentV2", + "responses": { + "200": { + "description": "A successful response.(streaming responses)", + "schema": { + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/lnrpcPayment" + }, + "error": { + "$ref": "#/definitions/runtimeStreamError" + } + }, + "title": "Stream result of lnrpcPayment" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/routerrpcSendPaymentRequest" + } + } + ], + "tags": [ + "Router" + ] + } + }, + "/v2/router/track/{payment_hash}": { + "get": { + "summary": "TrackPaymentV2 returns an update stream for the payment identified by the\npayment hash.", + "operationId": "TrackPaymentV2", + "responses": { + "200": { + "description": "A successful response.(streaming responses)", + "schema": { + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/lnrpcPayment" + }, + "error": { + "$ref": "#/definitions/runtimeStreamError" + } + }, + "title": "Stream result of lnrpcPayment" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "payment_hash", + "description": "The hash of the payment to look up.", + "in": "path", + "required": true, + "type": "string", + "format": "byte" + }, + { + "name": "no_inflight_updates", + "description": "If set, only the final payment update is streamed back. Intermediate updates\nthat show which htlcs are still in flight are suppressed.", + "in": "query", + "required": false, + "type": "boolean", + "format": "boolean" + } + ], + "tags": [ + "Router" + ] + } + } + }, "definitions": { "FailureFailureCode": { "type": "string", @@ -482,6 +807,34 @@ } } }, + "routerrpcBuildRouteRequest": { + "type": "object", + "properties": { + "amt_msat": { + "type": "string", + "format": "int64", + "description": "The amount to send expressed in msat. If set to zero, the minimum routable\namount is used." + }, + "final_cltv_delta": { + "type": "integer", + "format": "int32", + "title": "CLTV delta from the current height that should be used for the timelock\nof the final hop" + }, + "outgoing_chan_id": { + "type": "string", + "format": "uint64", + "description": "The channel id of the channel that must be taken to the first hop. If zero,\nany channel may be used." + }, + "hop_pubkeys": { + "type": "array", + "items": { + "type": "string", + "format": "byte" + }, + "description": "A list of hops that defines the route. This does not include the source hop\npubkey." + } + } + }, "routerrpcBuildRouteResponse": { "type": "object", "properties": { @@ -751,9 +1104,27 @@ } } }, + "routerrpcResetMissionControlRequest": { + "type": "object" + }, "routerrpcResetMissionControlResponse": { "type": "object" }, + "routerrpcRouteFeeRequest": { + "type": "object", + "properties": { + "dest": { + "type": "string", + "format": "byte", + "description": "The destination once wishes to obtain a routing fee quote to." + }, + "amt_sat": { + "type": "string", + "format": "int64", + "description": "The amount one wishes to send to the target destination." + } + } + }, "routerrpcRouteFeeResponse": { "type": "object", "properties": { @@ -769,6 +1140,129 @@ } } }, + "routerrpcSendPaymentRequest": { + "type": "object", + "properties": { + "dest": { + "type": "string", + "format": "byte", + "title": "The identity pubkey of the payment recipient" + }, + "amt": { + "type": "string", + "format": "int64", + "description": "Number of satoshis to send.\n\nThe fields amt and amt_msat are mutually exclusive." + }, + "amt_msat": { + "type": "string", + "format": "int64", + "description": "Number of millisatoshis to send.\n\nThe fields amt and amt_msat are mutually exclusive." + }, + "payment_hash": { + "type": "string", + "format": "byte", + "title": "The hash to use within the payment's HTLC" + }, + "final_cltv_delta": { + "type": "integer", + "format": "int32", + "description": "The CLTV delta from the current height that should be used to set the\ntimelock for the final hop." + }, + "payment_request": { + "type": "string", + "description": "A bare-bones invoice for a payment within the Lightning Network. With the\ndetails of the invoice, the sender has all the data necessary to send a\npayment to the recipient. The amount in the payment request may be zero. In\nthat case it is required to set the amt field as well. If no payment request\nis specified, the following fields are required: dest, amt and payment_hash." + }, + "timeout_seconds": { + "type": "integer", + "format": "int32", + "description": "An upper limit on the amount of time we should spend when attempting to\nfulfill the payment. This is expressed in seconds. If we cannot make a\nsuccessful payment within this time frame, an error will be returned.\nThis field must be non-zero." + }, + "fee_limit_sat": { + "type": "string", + "format": "int64", + "description": "The maximum number of satoshis that will be paid as a fee of the payment.\nIf this field is left to the default value of 0, only zero-fee routes will\nbe considered. This usually means single hop routes connecting directly to\nthe destination. To send the payment without a fee limit, use max int here.\n\nThe fields fee_limit_sat and fee_limit_msat are mutually exclusive." + }, + "fee_limit_msat": { + "type": "string", + "format": "int64", + "description": "The maximum number of millisatoshis that will be paid as a fee of the\npayment. If this field is left to the default value of 0, only zero-fee\nroutes will be considered. This usually means single hop routes connecting\ndirectly to the destination. To send the payment without a fee limit, use\nmax int here.\n\nThe fields fee_limit_sat and fee_limit_msat are mutually exclusive." + }, + "outgoing_chan_id": { + "type": "string", + "format": "uint64", + "description": "Deprecated, use outgoing_chan_ids. The channel id of the channel that must\nbe taken to the first hop. If zero, any channel may be used (unless\noutgoing_chan_ids are set)." + }, + "outgoing_chan_ids": { + "type": "array", + "items": { + "type": "string", + "format": "uint64" + }, + "description": "The channel ids of the channels are allowed for the first hop. If empty,\nany channel may be used." + }, + "last_hop_pubkey": { + "type": "string", + "format": "byte", + "description": "The pubkey of the last hop of the route. If empty, any hop may be used." + }, + "cltv_limit": { + "type": "integer", + "format": "int32", + "description": "An optional maximum total time lock for the route. This should not exceed\nlnd's `--max-cltv-expiry` setting. If zero, then the value of\n`--max-cltv-expiry` is enforced." + }, + "route_hints": { + "type": "array", + "items": { + "$ref": "#/definitions/lnrpcRouteHint" + }, + "description": "Optional route hints to reach the destination through private channels." + }, + "dest_custom_records": { + "type": "object", + "additionalProperties": { + "type": "string", + "format": "byte" + }, + "description": "An optional field that can be used to pass an arbitrary set of TLV records\nto a peer which understands the new records. This can be used to pass\napplication specific data during the payment attempt. Record types are\nrequired to be in the custom range \u003e= 65536. When using REST, the values\nmust be encoded as base64." + }, + "allow_self_payment": { + "type": "boolean", + "format": "boolean", + "description": "If set, circular payments to self are permitted." + }, + "dest_features": { + "type": "array", + "items": { + "$ref": "#/definitions/lnrpcFeatureBit" + }, + "description": "Features assumed to be supported by the final node. All transitive feature\ndependencies must also be set properly. For a given feature bit pair, either\noptional or remote may be set, but not both. If this field is nil or empty,\nthe router will try to load destination features from the graph as a\nfallback." + }, + "max_parts": { + "type": "integer", + "format": "int64", + "description": "The maximum number of partial payments that may be use to complete the full\namount." + }, + "no_inflight_updates": { + "type": "boolean", + "format": "boolean", + "description": "If set, only the final payment update is streamed back. Intermediate updates\nthat show which htlcs are still in flight are suppressed." + } + } + }, + "routerrpcSendToRouteRequest": { + "type": "object", + "properties": { + "payment_hash": { + "type": "string", + "format": "byte", + "description": "The payment hash to use for the HTLC." + }, + "route": { + "$ref": "#/definitions/lnrpcRoute", + "description": "Route that should be used to attempt to complete the payment." + } + } + }, "routerrpcSendToRouteResponse": { "type": "object", "properties": { @@ -786,6 +1280,27 @@ "routerrpcSettleEvent": { "type": "object" }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } + }, "runtimeStreamError": { "type": "object", "properties": { @@ -811,43 +1326,5 @@ } } } - }, - "x-stream-definitions": { - "lnrpcPayment": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/lnrpcPayment" - }, - "error": { - "$ref": "#/definitions/runtimeStreamError" - } - }, - "title": "Stream result of lnrpcPayment" - }, - "routerrpcHtlcEvent": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/routerrpcHtlcEvent" - }, - "error": { - "$ref": "#/definitions/runtimeStreamError" - } - }, - "title": "Stream result of routerrpcHtlcEvent" - }, - "routerrpcPaymentStatus": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/routerrpcPaymentStatus" - }, - "error": { - "$ref": "#/definitions/runtimeStreamError" - } - }, - "title": "Stream result of routerrpcPaymentStatus" - } } } diff --git a/lnrpc/routerrpc/router_server.go b/lnrpc/routerrpc/router_server.go index c3a9215d57..983090ed1b 100644 --- a/lnrpc/routerrpc/router_server.go +++ b/lnrpc/routerrpc/router_server.go @@ -10,6 +10,7 @@ import ( "sync/atomic" "github.com/btcsuite/btcutil" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lntypes" @@ -226,6 +227,28 @@ func (s *Server) RegisterWithRootServer(grpcServer *grpc.Server) error { return nil } +// RegisterWithRestServer will be called by the root REST mux to direct a sub +// RPC server to register itself with the main REST mux server. Until this is +// called, each sub-server won't be able to have requests routed towards it. +// +// NOTE: This is part of the lnrpc.SubServer interface. +func (s *Server) RegisterWithRestServer(ctx context.Context, + mux *runtime.ServeMux, dest string, opts []grpc.DialOption) error { + + // We make sure that we register it with the main REST server to ensure + // all our methods are routed properly. + err := RegisterRouterHandlerFromEndpoint(ctx, mux, dest, opts) + if err != nil { + log.Errorf("Could not register Router REST server "+ + "with root REST server: %v", err) + return err + } + + log.Debugf("Router REST server successfully registered with " + + "root REST server") + return nil +} + // SendPaymentV2 attempts to route a payment described by the passed // PaymentRequest to the final destination. If we are unable to route the // payment, or cannot find a route that satisfies the constraints in the diff --git a/lnrpc/rpc.pb.go b/lnrpc/rpc.pb.go index ee532aefd4..f6cc76fcd0 100644 --- a/lnrpc/rpc.pb.go +++ b/lnrpc/rpc.pb.go @@ -7,8 +7,9 @@ import ( context "context" fmt "fmt" proto "github.com/golang/protobuf/proto" - _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" math "math" ) @@ -11634,740 +11635,708 @@ func init() { func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } var fileDescriptor_77a6da22d6a3feb1 = []byte{ - // 11718 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7d, 0x5b, 0x6c, 0x23, 0x59, - 0x76, 0x58, 0xf3, 0x25, 0x92, 0x87, 0x0f, 0x51, 0x57, 0x2f, 0xb6, 0x7a, 0x7a, 0xba, 0xa7, 0xe6, - 0xd5, 0xd3, 0x33, 0xab, 0xee, 0xe9, 0xdd, 0x9e, 0xd9, 0xdd, 0x89, 0xd7, 0x4b, 0x49, 0xd4, 0x88, - 0xdb, 0x12, 0xa5, 0x29, 0x52, 0x33, 0x9e, 0xf5, 0xa3, 0x5c, 0x22, 0xaf, 0xa4, 0x72, 0x93, 0x55, - 0x9c, 0xaa, 0xa2, 0x5a, 0xda, 0xc1, 0xe4, 0x23, 0xc8, 0x0b, 0x46, 0x12, 0x20, 0x48, 0x1c, 0x20, - 0x4e, 0x8c, 0x3c, 0x8c, 0x24, 0xc8, 0x8f, 0x11, 0xc4, 0x4e, 0x80, 0x00, 0xf9, 0x8e, 0x7f, 0x12, - 0x04, 0x81, 0x9d, 0x8f, 0x04, 0x86, 0x81, 0x00, 0x89, 0xf3, 0x17, 0x18, 0xc8, 0x57, 0x3e, 0x02, - 0x04, 0xf7, 0x9c, 0x7b, 0xab, 0x6e, 0x91, 0xa5, 0xee, 0x9e, 0xf5, 0x64, 0x7f, 0x24, 0xde, 0x73, - 0xcf, 0x7d, 0x9f, 0x7b, 0xee, 0x79, 0xdd, 0x5b, 0x50, 0xf6, 0x27, 0x83, 0xcd, 0x89, 0xef, 0x85, - 0x1e, 0x2b, 0x8c, 0x5c, 0x7f, 0x32, 0xd8, 0x78, 0xe5, 0xcc, 0xf3, 0xce, 0x46, 0xfc, 0x81, 0x3d, - 0x71, 0x1e, 0xd8, 0xae, 0xeb, 0x85, 0x76, 0xe8, 0x78, 0x6e, 0x40, 0x48, 0xc6, 0x9f, 0x64, 0x20, - 0x7f, 0x1c, 0x5e, 0x7a, 0xec, 0x31, 0x54, 0xed, 0xe1, 0xd0, 0xe7, 0x41, 0x60, 0x85, 0x57, 0x13, - 0xde, 0xcc, 0xdc, 0xcd, 0xdc, 0xab, 0x3f, 0x62, 0x9b, 0x58, 0xc9, 0x66, 0x8b, 0xb2, 0xfa, 0x57, - 0x13, 0x6e, 0x56, 0xec, 0x38, 0xc1, 0x9a, 0x50, 0x94, 0xc9, 0x66, 0xf6, 0x6e, 0xe6, 0x5e, 0xd9, - 0x54, 0x49, 0x76, 0x1b, 0xc0, 0x1e, 0x7b, 0x53, 0x37, 0xb4, 0x02, 0x3b, 0x6c, 0xe6, 0xee, 0x66, - 0xee, 0xe5, 0xcc, 0x32, 0x41, 0x7a, 0x76, 0xc8, 0x6e, 0x41, 0x79, 0xf2, 0xd4, 0x0a, 0x06, 0xbe, - 0x33, 0x09, 0x9b, 0x79, 0x2c, 0x5a, 0x9a, 0x3c, 0xed, 0x61, 0x9a, 0xbd, 0x0b, 0x25, 0x6f, 0x1a, - 0x4e, 0x3c, 0xc7, 0x0d, 0x9b, 0x85, 0xbb, 0x99, 0x7b, 0x95, 0x47, 0x8b, 0xb2, 0x23, 0x87, 0xd3, - 0xf0, 0x48, 0x80, 0xcd, 0x08, 0x81, 0xbd, 0x01, 0xb5, 0x81, 0xe7, 0x9e, 0x3a, 0xfe, 0x98, 0x46, - 0xd6, 0x5c, 0xc0, 0xb6, 0x92, 0x40, 0xe3, 0xdf, 0x65, 0xa1, 0xd2, 0xf7, 0x6d, 0x37, 0xb0, 0x07, - 0x02, 0xc0, 0xd6, 0xa1, 0x18, 0x5e, 0x5a, 0xe7, 0x76, 0x70, 0x8e, 0x43, 0x2d, 0x9b, 0x0b, 0xe1, - 0xe5, 0x9e, 0x1d, 0x9c, 0xb3, 0x35, 0x58, 0xa0, 0x5e, 0xe2, 0x80, 0x72, 0xa6, 0x4c, 0xb1, 0x77, - 0x61, 0xc9, 0x9d, 0x8e, 0xad, 0x64, 0x53, 0x62, 0x58, 0x05, 0xb3, 0xe1, 0x4e, 0xc7, 0xdb, 0x3a, - 0x5c, 0x0c, 0xfe, 0x64, 0xe4, 0x0d, 0x9e, 0x52, 0x03, 0x34, 0xbc, 0x32, 0x42, 0xb0, 0x8d, 0xd7, - 0xa0, 0x2a, 0xb3, 0xb9, 0x73, 0x76, 0x4e, 0x63, 0x2c, 0x98, 0x15, 0x42, 0x40, 0x90, 0xa8, 0x21, - 0x74, 0xc6, 0xdc, 0x0a, 0x42, 0x7b, 0x3c, 0x91, 0x43, 0x2a, 0x0b, 0x48, 0x4f, 0x00, 0x30, 0xdb, - 0x0b, 0xed, 0x91, 0x75, 0xca, 0x79, 0xd0, 0x2c, 0xca, 0x6c, 0x01, 0xd9, 0xe5, 0x3c, 0x60, 0x6f, - 0x42, 0x7d, 0xc8, 0x83, 0xd0, 0x92, 0x8b, 0xc1, 0x83, 0x66, 0xe9, 0x6e, 0xee, 0x5e, 0xd9, 0xac, - 0x09, 0x68, 0x4b, 0x01, 0xd9, 0x2b, 0x00, 0xbe, 0xfd, 0xcc, 0x12, 0x13, 0xc1, 0x2f, 0x9b, 0x65, - 0x5a, 0x05, 0xdf, 0x7e, 0xd6, 0xbf, 0xdc, 0xe3, 0x97, 0x6c, 0x05, 0x0a, 0x23, 0xfb, 0x84, 0x8f, - 0x9a, 0x80, 0x19, 0x94, 0x30, 0x7e, 0x0c, 0x6b, 0x1f, 0xf3, 0x50, 0x9b, 0xca, 0xc0, 0xe4, 0x5f, - 0x4c, 0x79, 0x10, 0x8a, 0x51, 0x05, 0xa1, 0xed, 0x87, 0x6a, 0x54, 0x19, 0x1a, 0x15, 0xc2, 0xe2, - 0x51, 0x71, 0x77, 0xa8, 0x10, 0xb2, 0x88, 0x50, 0xe6, 0xee, 0x90, 0xb2, 0x8d, 0x7d, 0x60, 0x5a, - 0xc5, 0x3b, 0x3c, 0xb4, 0x9d, 0x51, 0xc0, 0x3e, 0x80, 0x6a, 0xa8, 0x35, 0xd7, 0xcc, 0xdc, 0xcd, - 0xdd, 0xab, 0x44, 0xa4, 0xa9, 0x15, 0x30, 0x13, 0x78, 0xc6, 0x39, 0x94, 0x76, 0x39, 0xdf, 0x77, - 0xc6, 0x4e, 0xc8, 0xd6, 0xa0, 0x70, 0xea, 0x5c, 0xf2, 0x21, 0x76, 0x2a, 0xb7, 0x77, 0xc3, 0xa4, - 0x24, 0xbb, 0x03, 0x80, 0x3f, 0xac, 0x71, 0x44, 0xa5, 0x7b, 0x37, 0xcc, 0x32, 0xc2, 0x0e, 0x02, - 0x3b, 0x64, 0x1b, 0x50, 0x9c, 0x70, 0x7f, 0xc0, 0x15, 0x3d, 0xec, 0xdd, 0x30, 0x15, 0x60, 0xab, - 0x08, 0x85, 0x91, 0xa8, 0xdd, 0xf8, 0xfd, 0x02, 0x54, 0x7a, 0xdc, 0x1d, 0xaa, 0x99, 0x60, 0x90, - 0x17, 0x13, 0x8d, 0x8d, 0x55, 0x4d, 0xfc, 0xcd, 0x5e, 0x87, 0x0a, 0x2e, 0x49, 0x10, 0xfa, 0x8e, - 0x7b, 0x46, 0xbb, 0x65, 0x2b, 0xdb, 0xcc, 0x98, 0x20, 0xc0, 0x3d, 0x84, 0xb2, 0x06, 0xe4, 0xec, - 0xb1, 0xda, 0x2d, 0xe2, 0x27, 0xbb, 0x09, 0x25, 0x7b, 0x1c, 0x52, 0xf7, 0xaa, 0x08, 0x2e, 0xda, - 0xe3, 0x10, 0xbb, 0xf6, 0x1a, 0x54, 0x27, 0xf6, 0xd5, 0x98, 0xbb, 0x61, 0x4c, 0x66, 0x55, 0xb3, - 0x22, 0x61, 0x48, 0x68, 0x8f, 0x60, 0x59, 0x47, 0x51, 0x8d, 0x17, 0xa2, 0xc6, 0x97, 0x34, 0x6c, - 0xd9, 0x87, 0xb7, 0x61, 0x51, 0x95, 0xf1, 0x69, 0x3c, 0x48, 0x7e, 0x65, 0xb3, 0x2e, 0xc1, 0x6a, - 0x94, 0xf7, 0xa0, 0x71, 0xea, 0xb8, 0xf6, 0xc8, 0x1a, 0x8c, 0xc2, 0x0b, 0x6b, 0xc8, 0x47, 0xa1, - 0x8d, 0x94, 0x58, 0x30, 0xeb, 0x08, 0xdf, 0x1e, 0x85, 0x17, 0x3b, 0x02, 0xca, 0xde, 0x83, 0xf2, - 0x29, 0xe7, 0x16, 0x4e, 0x56, 0xb3, 0x94, 0xd8, 0xd0, 0x6a, 0x85, 0xcc, 0xd2, 0xa9, 0x5a, 0xab, - 0xf7, 0xa0, 0xe1, 0x4d, 0xc3, 0x33, 0xcf, 0x71, 0xcf, 0xac, 0xc1, 0xb9, 0xed, 0x5a, 0xce, 0x10, - 0x69, 0x33, 0xbf, 0x95, 0x7d, 0x98, 0x31, 0xeb, 0x2a, 0x6f, 0xfb, 0xdc, 0x76, 0x3b, 0x43, 0xf6, - 0x16, 0x2c, 0x8e, 0xec, 0x20, 0xb4, 0xce, 0xbd, 0x89, 0x35, 0x99, 0x9e, 0x3c, 0xe5, 0x57, 0xcd, - 0x1a, 0x4e, 0x44, 0x4d, 0x80, 0xf7, 0xbc, 0xc9, 0x11, 0x02, 0x05, 0xe9, 0x61, 0x3f, 0xa9, 0x13, - 0x82, 0xa4, 0x6b, 0x66, 0x59, 0x40, 0xa8, 0xd1, 0xcf, 0x61, 0x19, 0x97, 0x67, 0x30, 0x0d, 0x42, - 0x6f, 0x6c, 0xf9, 0x7c, 0xe0, 0xf9, 0xc3, 0xa0, 0x59, 0x41, 0x5a, 0x7b, 0x47, 0x76, 0x56, 0x5b, - 0xe3, 0xcd, 0x1d, 0x1e, 0x84, 0xdb, 0x88, 0x6c, 0x12, 0x6e, 0xdb, 0x0d, 0xfd, 0x2b, 0x73, 0x69, - 0x38, 0x0b, 0x67, 0xef, 0x01, 0xb3, 0x47, 0x23, 0xef, 0x99, 0x15, 0xf0, 0xd1, 0xa9, 0x25, 0x27, - 0xb1, 0x59, 0xbf, 0x9b, 0xb9, 0x57, 0x32, 0x1b, 0x98, 0xd3, 0xe3, 0xa3, 0xd3, 0x23, 0x82, 0xb3, - 0x0f, 0x00, 0x37, 0xa9, 0x75, 0xca, 0xed, 0x70, 0xea, 0xf3, 0xa0, 0xb9, 0x78, 0x37, 0x77, 0xaf, - 0xfe, 0x68, 0x29, 0x9a, 0x2f, 0x04, 0x6f, 0x39, 0xa1, 0x59, 0x15, 0x78, 0x32, 0x1d, 0x6c, 0xec, - 0xc0, 0x5a, 0x7a, 0x97, 0x04, 0x51, 0x89, 0x59, 0x11, 0xc4, 0x98, 0x37, 0xc5, 0x4f, 0xb1, 0xb3, - 0x2f, 0xec, 0xd1, 0x94, 0x23, 0x15, 0x56, 0x4d, 0x4a, 0x7c, 0x3f, 0xfb, 0xdd, 0x8c, 0xf1, 0x7b, - 0x19, 0xa8, 0xd2, 0x28, 0x83, 0x89, 0xe7, 0x06, 0x9c, 0xbd, 0x0e, 0x35, 0x45, 0x0d, 0xdc, 0xf7, - 0x3d, 0x5f, 0x72, 0x4b, 0x45, 0x79, 0x6d, 0x01, 0x63, 0xef, 0x40, 0x43, 0x21, 0x4d, 0x7c, 0xee, - 0x8c, 0xed, 0x33, 0x55, 0xb5, 0x22, 0xa5, 0x23, 0x09, 0x66, 0xef, 0xc7, 0xf5, 0xf9, 0xde, 0x34, - 0xe4, 0x48, 0xeb, 0x95, 0x47, 0x55, 0x39, 0x3c, 0x53, 0xc0, 0xa2, 0xda, 0x31, 0xf5, 0x12, 0x74, - 0x6e, 0xfc, 0x46, 0x06, 0x98, 0xe8, 0x76, 0xdf, 0xa3, 0x0a, 0x62, 0x8e, 0x94, 0x28, 0x99, 0x79, - 0xe9, 0x1d, 0x92, 0x7d, 0xde, 0x0e, 0x31, 0xa0, 0x40, 0x7d, 0xcf, 0xa7, 0xf4, 0x9d, 0xb2, 0x7e, - 0x94, 0x2f, 0xe5, 0x1a, 0x79, 0xe3, 0xbf, 0xe6, 0x60, 0x45, 0xd0, 0xa9, 0xcb, 0x47, 0xad, 0xc1, - 0x80, 0x4f, 0xa2, 0xbd, 0x73, 0x07, 0x2a, 0xae, 0x37, 0xe4, 0x8a, 0x62, 0xa9, 0x63, 0x20, 0x40, - 0x1a, 0xb9, 0x9e, 0xdb, 0x8e, 0x4b, 0x1d, 0xa7, 0xc9, 0x2c, 0x23, 0x04, 0xbb, 0xfd, 0x16, 0x2c, - 0x4e, 0xb8, 0x3b, 0xd4, 0xb7, 0x48, 0x8e, 0xa8, 0x5e, 0x82, 0xe5, 0xee, 0xb8, 0x03, 0x95, 0xd3, - 0x29, 0xe1, 0x09, 0xc6, 0x92, 0x47, 0x1a, 0x00, 0x09, 0x6a, 0x11, 0x7f, 0x99, 0x4c, 0x83, 0x73, - 0xcc, 0x2d, 0x60, 0x6e, 0x51, 0xa4, 0x45, 0xd6, 0x6d, 0x80, 0xe1, 0x34, 0x08, 0xe5, 0x8e, 0x59, - 0xc0, 0xcc, 0xb2, 0x80, 0xd0, 0x8e, 0xf9, 0x16, 0x2c, 0x8f, 0xed, 0x4b, 0x0b, 0x69, 0xc7, 0x72, - 0x5c, 0xeb, 0x74, 0x84, 0x4c, 0xbd, 0x88, 0x78, 0x8d, 0xb1, 0x7d, 0xf9, 0xa9, 0xc8, 0xe9, 0xb8, - 0xbb, 0x08, 0x17, 0x6c, 0x65, 0x40, 0x33, 0x61, 0xf9, 0x3c, 0xe0, 0xfe, 0x05, 0x47, 0x4e, 0x90, - 0x37, 0xeb, 0x12, 0x6c, 0x12, 0x54, 0xf4, 0x68, 0x2c, 0xc6, 0x1d, 0x8e, 0x06, 0xb4, 0xed, 0xcd, - 0xe2, 0xd8, 0x71, 0xf7, 0xc2, 0xd1, 0x40, 0x9c, 0x57, 0x82, 0x8f, 0x4c, 0xb8, 0x6f, 0x3d, 0x7d, - 0x86, 0x7b, 0x38, 0x8f, 0x7c, 0xe3, 0x88, 0xfb, 0x4f, 0x9e, 0x09, 0x91, 0x62, 0x10, 0x20, 0x23, - 0xb2, 0xaf, 0x9a, 0x15, 0xdc, 0xe0, 0xa5, 0x41, 0x20, 0x58, 0x90, 0x7d, 0x25, 0x36, 0xa1, 0xe8, - 0xad, 0x8d, 0xab, 0xc0, 0x87, 0x58, 0x7d, 0x80, 0x1c, 0xb5, 0x86, 0x9d, 0x6d, 0xc9, 0x0c, 0xd1, - 0x4e, 0x20, 0xa8, 0x5e, 0x75, 0xf6, 0x74, 0x64, 0x9f, 0x05, 0xc8, 0x52, 0x6a, 0x66, 0x55, 0x02, - 0x77, 0x05, 0xcc, 0xf8, 0x0c, 0x56, 0x67, 0xd6, 0x56, 0xee, 0x19, 0x21, 0x42, 0x20, 0x04, 0xd7, - 0xb5, 0x64, 0xca, 0x54, 0xda, 0xa2, 0x65, 0x53, 0x16, 0xcd, 0xf8, 0xad, 0x0c, 0x54, 0x65, 0xcd, - 0x28, 0xec, 0xb0, 0x4d, 0x60, 0x6a, 0x15, 0xc3, 0x4b, 0x67, 0x68, 0x9d, 0x5c, 0x85, 0x3c, 0x20, - 0xa2, 0xd9, 0xbb, 0x61, 0x36, 0x64, 0x5e, 0xff, 0xd2, 0x19, 0x6e, 0x89, 0x1c, 0x76, 0x1f, 0x1a, - 0x09, 0xfc, 0x20, 0xf4, 0x89, 0xa2, 0xf7, 0x6e, 0x98, 0x75, 0x0d, 0xbb, 0x17, 0xfa, 0x62, 0x8f, - 0x08, 0x51, 0x6a, 0x1a, 0x5a, 0x8e, 0x3b, 0xe4, 0x97, 0x48, 0x46, 0x35, 0xb3, 0x42, 0xb0, 0x8e, - 0x00, 0x6d, 0xd5, 0xa1, 0xaa, 0x57, 0x67, 0x9c, 0x41, 0x49, 0xc9, 0x61, 0x28, 0x88, 0xcc, 0x74, - 0xc9, 0x2c, 0x87, 0x51, 0x4f, 0x6e, 0x42, 0x29, 0xd9, 0x03, 0xb3, 0x18, 0xbe, 0x74, 0xc3, 0xc6, - 0x0f, 0xa0, 0xb1, 0x2f, 0x88, 0xc7, 0x15, 0xc4, 0x2a, 0xe5, 0xca, 0x35, 0x58, 0xd0, 0x36, 0x4d, - 0xd9, 0x94, 0x29, 0x71, 0xe6, 0x9e, 0x7b, 0x41, 0x28, 0x5b, 0xc1, 0xdf, 0xc6, 0xef, 0x67, 0x80, - 0xb5, 0x83, 0xd0, 0x19, 0xdb, 0x21, 0xdf, 0xe5, 0x11, 0x5b, 0x38, 0x84, 0xaa, 0xa8, 0xad, 0xef, - 0xb5, 0x48, 0xd0, 0x23, 0x81, 0xe2, 0x5d, 0xb9, 0x8d, 0xe7, 0x0b, 0x6c, 0xea, 0xd8, 0xc4, 0xe6, - 0x13, 0x15, 0x88, 0x5d, 0x16, 0xda, 0xfe, 0x19, 0x0f, 0x51, 0x3c, 0x94, 0x72, 0x0d, 0x10, 0x48, - 0x08, 0x86, 0x1b, 0x3f, 0x0f, 0x4b, 0x73, 0x75, 0xe8, 0x7c, 0xb9, 0x9c, 0xc2, 0x97, 0x73, 0x3a, - 0x5f, 0xb6, 0x60, 0x39, 0xd1, 0x2f, 0x49, 0x69, 0xeb, 0x50, 0x14, 0x1b, 0x42, 0x08, 0x07, 0x19, - 0x92, 0x56, 0x4f, 0x39, 0x17, 0xe2, 0xf5, 0x03, 0x58, 0x39, 0xe5, 0xdc, 0xb7, 0x43, 0xcc, 0xc4, - 0x1d, 0x23, 0x56, 0x48, 0x56, 0xbc, 0x24, 0xf3, 0x7a, 0x76, 0x78, 0xc4, 0x7d, 0xb1, 0x52, 0xc6, - 0xff, 0xc9, 0xc0, 0xa2, 0xe0, 0xa0, 0x07, 0xb6, 0x7b, 0xa5, 0xe6, 0x69, 0x3f, 0x75, 0x9e, 0xee, - 0x69, 0x87, 0xa1, 0x86, 0xfd, 0x75, 0x27, 0x29, 0x37, 0x3b, 0x49, 0xec, 0x2e, 0x54, 0x13, 0x7d, - 0x2d, 0x60, 0x5f, 0x21, 0x88, 0x3a, 0x19, 0x4b, 0xa4, 0x0b, 0x9a, 0x44, 0xfa, 0x67, 0x9f, 0xdc, - 0xb7, 0xa0, 0x11, 0x0f, 0x46, 0xce, 0x2c, 0x83, 0xbc, 0x20, 0x54, 0x59, 0x01, 0xfe, 0x36, 0xfe, - 0x65, 0x86, 0x10, 0xb7, 0x3d, 0x27, 0x96, 0x7a, 0x19, 0xe4, 0x85, 0x94, 0xad, 0x10, 0xc5, 0xef, - 0x6b, 0x75, 0x88, 0x6f, 0x60, 0x0a, 0x6e, 0x42, 0x29, 0x10, 0x22, 0xb4, 0x3d, 0xa2, 0x59, 0x28, - 0x99, 0x45, 0x91, 0x6e, 0x8d, 0x46, 0xf1, 0xec, 0x14, 0x75, 0x79, 0xfd, 0x6d, 0x58, 0xd2, 0xfa, - 0xfc, 0x9c, 0xd1, 0x75, 0x81, 0xed, 0x3b, 0x41, 0x78, 0xec, 0x06, 0x13, 0x4d, 0xc8, 0xbb, 0x05, - 0x65, 0xc1, 0x8d, 0x45, 0x7f, 0x03, 0x29, 0xd1, 0x0b, 0xf6, 0x2c, 0x7a, 0x1b, 0x60, 0xa6, 0x7d, - 0x29, 0x33, 0xb3, 0x32, 0xd3, 0xbe, 0xc4, 0x4c, 0xe3, 0xbb, 0xb0, 0x9c, 0xa8, 0x4f, 0x36, 0xfd, - 0x1a, 0x14, 0xa6, 0xe1, 0xa5, 0xa7, 0xc4, 0xf8, 0x8a, 0xa4, 0x26, 0xa1, 0x84, 0x9a, 0x94, 0x63, - 0x7c, 0x04, 0x4b, 0x5d, 0xfe, 0x4c, 0x6e, 0x78, 0xd5, 0x91, 0xb7, 0x20, 0xff, 0x02, 0xc5, 0x14, - 0xf3, 0x8d, 0x4d, 0x60, 0x7a, 0x61, 0xd9, 0xaa, 0xa6, 0xa7, 0x66, 0x12, 0x7a, 0xaa, 0xf1, 0x16, - 0xb0, 0x9e, 0x73, 0xe6, 0x1e, 0xf0, 0x20, 0xb0, 0xcf, 0x22, 0x16, 0xd1, 0x80, 0xdc, 0x38, 0x38, - 0x93, 0xfc, 0x4c, 0xfc, 0x34, 0xbe, 0x0d, 0xcb, 0x09, 0x3c, 0x59, 0xf1, 0x2b, 0x50, 0x0e, 0x9c, - 0x33, 0x17, 0x85, 0x30, 0x59, 0x75, 0x0c, 0x30, 0x76, 0x61, 0xe5, 0x53, 0xee, 0x3b, 0xa7, 0x57, - 0x2f, 0xaa, 0x3e, 0x59, 0x4f, 0x76, 0xb6, 0x9e, 0x36, 0xac, 0xce, 0xd4, 0x23, 0x9b, 0x27, 0xa2, - 0x96, 0x2b, 0x59, 0x32, 0x29, 0xa1, 0xf1, 0xc8, 0xac, 0xce, 0x23, 0x8d, 0x63, 0x60, 0xdb, 0x9e, - 0xeb, 0xf2, 0x41, 0x78, 0xc4, 0xb9, 0xaf, 0x3a, 0xf3, 0xae, 0x46, 0xc1, 0x95, 0x47, 0xeb, 0x72, - 0x66, 0x67, 0x19, 0xaf, 0x24, 0x6d, 0x06, 0xf9, 0x09, 0xf7, 0xc7, 0x58, 0x71, 0xc9, 0xc4, 0xdf, - 0xc6, 0x2a, 0x2c, 0x27, 0xaa, 0xa5, 0xbe, 0x19, 0x0f, 0x61, 0x75, 0xc7, 0x09, 0x06, 0xf3, 0x0d, - 0xae, 0x43, 0x71, 0x32, 0x3d, 0xb1, 0x92, 0x3c, 0xfc, 0x09, 0xbf, 0x32, 0x9a, 0xb0, 0x36, 0x5b, - 0x42, 0xd6, 0xf5, 0x17, 0x33, 0x90, 0xdf, 0xeb, 0xef, 0x6f, 0xb3, 0x0d, 0x28, 0x39, 0xee, 0xc0, - 0x1b, 0x0b, 0x21, 0x8d, 0xc6, 0x1c, 0xa5, 0xaf, 0xdd, 0x76, 0xb7, 0xa0, 0x8c, 0xb2, 0x9d, 0x50, - 0xaf, 0xa5, 0x98, 0x54, 0x12, 0x80, 0x7d, 0x6f, 0xf0, 0x54, 0xe8, 0xf5, 0xfc, 0x72, 0xe2, 0xf8, - 0xa8, 0xb9, 0x2b, 0xcd, 0x34, 0x4f, 0x72, 0x41, 0x9c, 0x21, 0x15, 0xd4, 0x7f, 0x53, 0x82, 0xa2, - 0x3c, 0x99, 0xe9, 0x94, 0x0f, 0x9d, 0x0b, 0x1e, 0x9f, 0xf2, 0x22, 0x25, 0x64, 0x07, 0x9f, 0x8f, - 0xbd, 0x30, 0x12, 0xee, 0x68, 0x0d, 0xaa, 0x04, 0x94, 0xe2, 0x9d, 0x26, 0x60, 0x90, 0x99, 0x23, - 0x47, 0x48, 0x03, 0xfd, 0xd8, 0xbf, 0x05, 0x45, 0x25, 0x27, 0xe4, 0x23, 0xfd, 0x67, 0x61, 0x40, - 0x92, 0xdd, 0x06, 0x94, 0x06, 0xf6, 0xc4, 0x1e, 0x38, 0xe1, 0x95, 0x64, 0x13, 0x51, 0x5a, 0xd4, - 0x3e, 0xf2, 0x06, 0xf6, 0xc8, 0x3a, 0xb1, 0x47, 0xb6, 0x3b, 0xe0, 0xd2, 0x7e, 0x50, 0x45, 0xe0, - 0x16, 0xc1, 0xd8, 0x9b, 0x50, 0x97, 0xfd, 0x54, 0x58, 0x64, 0x46, 0x90, 0xbd, 0x57, 0x68, 0x42, - 0x10, 0xf5, 0xc6, 0x63, 0x47, 0x68, 0x24, 0x24, 0xb2, 0xe5, 0xcc, 0x32, 0x41, 0x76, 0x39, 0x8e, - 0x56, 0x66, 0x3f, 0xa3, 0xa9, 0x2b, 0x53, 0x53, 0x04, 0xfc, 0x8c, 0xd4, 0xfe, 0x79, 0xb9, 0x2d, - 0xa7, 0xc9, 0x6d, 0xef, 0xc2, 0xd2, 0xd4, 0x0d, 0x78, 0x18, 0x8e, 0xf8, 0x30, 0xea, 0x4b, 0x05, - 0x91, 0x1a, 0x51, 0x86, 0xea, 0xce, 0x26, 0x2c, 0x93, 0xe1, 0x23, 0xb0, 0x43, 0x2f, 0x38, 0x77, - 0x02, 0x2b, 0x10, 0xda, 0x14, 0xa9, 0xc6, 0x4b, 0x98, 0xd5, 0x93, 0x39, 0x3d, 0x52, 0xa7, 0xd6, - 0x67, 0xf0, 0x7d, 0x3e, 0xe0, 0xce, 0x05, 0x1f, 0xa2, 0x4c, 0x97, 0x33, 0x57, 0x13, 0x65, 0x4c, - 0x99, 0x89, 0x02, 0xfa, 0x74, 0x6c, 0x4d, 0x27, 0x43, 0x5b, 0x08, 0x36, 0x75, 0x12, 0x9c, 0xdd, - 0xe9, 0xf8, 0x98, 0x20, 0xec, 0x21, 0x28, 0xa9, 0x4d, 0xca, 0x92, 0x8b, 0x09, 0x7e, 0x26, 0x88, - 0xd5, 0xac, 0x4a, 0x0c, 0x12, 0x2a, 0x13, 0xf2, 0x69, 0x63, 0x46, 0x3e, 0x6d, 0x42, 0x71, 0xe2, - 0x3b, 0x17, 0x76, 0xc8, 0x9b, 0x4b, 0xc4, 0xd6, 0x65, 0x52, 0x70, 0x06, 0xc7, 0x75, 0x42, 0xc7, - 0x0e, 0x3d, 0xbf, 0xc9, 0x30, 0x2f, 0x06, 0xb0, 0xfb, 0xb0, 0x84, 0x34, 0x12, 0x84, 0x76, 0x38, - 0x0d, 0xa4, 0xb4, 0xba, 0x8c, 0xc4, 0x84, 0xf2, 0x76, 0x0f, 0xe1, 0x28, 0xb0, 0xb2, 0x6f, 0xc3, - 0x1a, 0x91, 0x05, 0x96, 0x90, 0x52, 0x38, 0x0a, 0x0f, 0x2b, 0x38, 0x15, 0xcb, 0x98, 0x2b, 0xe8, - 0x5b, 0xca, 0xe2, 0x42, 0x92, 0x78, 0x0c, 0xeb, 0x92, 0x4c, 0xe6, 0x4a, 0xad, 0x62, 0xa9, 0x15, - 0xca, 0x9e, 0x29, 0xb6, 0x09, 0x4b, 0xa2, 0x4b, 0xce, 0xc0, 0x92, 0xa5, 0xc5, 0x4e, 0x58, 0x13, - 0xbd, 0x47, 0xad, 0x6a, 0x91, 0x32, 0x4d, 0xcc, 0x7b, 0xc2, 0xaf, 0xd8, 0x0f, 0x60, 0x91, 0x48, - 0x06, 0x55, 0x31, 0xe4, 0xf4, 0x1b, 0xc8, 0xe9, 0x57, 0xe5, 0x84, 0x6e, 0x47, 0xb9, 0xc8, 0xec, - 0xeb, 0x83, 0x44, 0x5a, 0x6c, 0x87, 0x91, 0x73, 0xca, 0x43, 0x67, 0xcc, 0x9b, 0xeb, 0x44, 0x60, - 0x2a, 0x2d, 0x76, 0xea, 0x74, 0x82, 0x39, 0x4d, 0xe2, 0x0b, 0x94, 0x42, 0xda, 0x1d, 0x79, 0x01, - 0x57, 0x66, 0xb2, 0xe6, 0x4d, 0xb9, 0x09, 0x05, 0x50, 0xc9, 0x9b, 0x42, 0x68, 0x27, 0x05, 0x29, - 0x32, 0x66, 0xde, 0x42, 0x62, 0xa8, 0x91, 0x9e, 0xa4, 0x0c, 0x9a, 0xe2, 0x6c, 0x3f, 0xb7, 0x9f, - 0x29, 0x0e, 0xf2, 0x0a, 0xae, 0x2f, 0x08, 0x90, 0xe4, 0x1d, 0xbf, 0x9b, 0xa1, 0x03, 0x51, 0xf2, - 0x8f, 0x40, 0x53, 0x05, 0x89, 0x73, 0x58, 0x9e, 0x3b, 0xba, 0x92, 0xcc, 0x04, 0x08, 0x74, 0xe8, - 0x8e, 0x70, 0x37, 0x3b, 0xae, 0x8e, 0x42, 0xbc, 0xb7, 0xaa, 0x80, 0x88, 0x74, 0x07, 0x2a, 0x93, - 0xe9, 0xc9, 0xc8, 0x19, 0x10, 0x4a, 0x8e, 0x6a, 0x21, 0x10, 0x22, 0x08, 0x5d, 0x98, 0x28, 0x8a, - 0x30, 0xf2, 0x88, 0x51, 0x91, 0x30, 0x44, 0x41, 0xde, 0xce, 0x7d, 0x64, 0x27, 0x55, 0x13, 0x7f, - 0x1b, 0x5b, 0xb0, 0x92, 0xec, 0xb4, 0x3c, 0x78, 0xee, 0x43, 0x49, 0xf2, 0x2a, 0x65, 0x24, 0xa9, - 0xab, 0x85, 0x92, 0xea, 0x5c, 0x94, 0x6f, 0xfc, 0x76, 0x01, 0x96, 0x25, 0x74, 0x5b, 0x4c, 0x6d, - 0x6f, 0x3a, 0x1e, 0xdb, 0x7e, 0x0a, 0x13, 0xcc, 0x3c, 0x9f, 0x09, 0x66, 0xe7, 0x98, 0x60, 0x52, - 0x4b, 0x26, 0x1e, 0x9a, 0xd4, 0x92, 0xc5, 0x5a, 0x92, 0xe2, 0xa2, 0xdb, 0x62, 0x6b, 0x12, 0xdc, - 0x27, 0x9b, 0xef, 0x1c, 0xcb, 0x2e, 0xa4, 0xb0, 0x6c, 0x9d, 0xe1, 0x2e, 0xcc, 0x30, 0xdc, 0xd7, - 0x80, 0x88, 0x46, 0xad, 0x7e, 0x91, 0x74, 0x19, 0x84, 0x49, 0xd3, 0xe7, 0xdb, 0xb0, 0x38, 0xcb, - 0xe3, 0x88, 0x99, 0xd6, 0x53, 0x38, 0x9c, 0x33, 0xe6, 0x78, 0x5a, 0x69, 0xc8, 0x65, 0xc9, 0xe1, - 0x9c, 0x31, 0xdf, 0xc7, 0x1c, 0x85, 0xdf, 0x06, 0xa0, 0xb6, 0x71, 0xd3, 0x00, 0x6e, 0x9a, 0xb7, - 0x92, 0x6b, 0xa1, 0xcf, 0xfa, 0xa6, 0x48, 0x4c, 0x7d, 0x8e, 0xbb, 0xa8, 0x8c, 0x25, 0x71, 0x03, - 0x7d, 0x08, 0x75, 0x6f, 0xc2, 0x5d, 0x2b, 0xe6, 0x35, 0x15, 0xac, 0xaa, 0x21, 0xab, 0xea, 0x28, - 0xb8, 0x59, 0x13, 0x78, 0x51, 0x92, 0x7d, 0x8f, 0x26, 0x99, 0x6b, 0x25, 0xab, 0xd7, 0x94, 0xac, - 0x23, 0x62, 0x94, 0x36, 0x7e, 0x3d, 0x03, 0x15, 0xad, 0x3b, 0x6c, 0x15, 0x96, 0xb6, 0x0f, 0x0f, - 0x8f, 0xda, 0x66, 0xab, 0xdf, 0xf9, 0xb4, 0x6d, 0x6d, 0xef, 0x1f, 0xf6, 0xda, 0x8d, 0x1b, 0x02, - 0xbc, 0x7f, 0xb8, 0xdd, 0xda, 0xb7, 0x76, 0x0f, 0xcd, 0x6d, 0x05, 0xce, 0xb0, 0x35, 0x60, 0x66, - 0xfb, 0xe0, 0xb0, 0xdf, 0x4e, 0xc0, 0xb3, 0xac, 0x01, 0xd5, 0x2d, 0xb3, 0xdd, 0xda, 0xde, 0x93, - 0x90, 0x1c, 0x5b, 0x81, 0xc6, 0xee, 0x71, 0x77, 0xa7, 0xd3, 0xfd, 0xd8, 0xda, 0x6e, 0x75, 0xb7, - 0xdb, 0xfb, 0xed, 0x9d, 0x46, 0x9e, 0xd5, 0xa0, 0xdc, 0xda, 0x6a, 0x75, 0x77, 0x0e, 0xbb, 0xed, - 0x9d, 0x46, 0xc1, 0xf8, 0xe3, 0x0c, 0xac, 0xe2, 0x44, 0x0d, 0x67, 0x77, 0xe8, 0x5d, 0xa8, 0x0c, - 0x3c, 0x6f, 0x22, 0x54, 0xa6, 0xf8, 0xb8, 0xd7, 0x41, 0x62, 0xf7, 0x11, 0x67, 0x3d, 0xf5, 0xfc, - 0x01, 0x97, 0x1b, 0x14, 0x10, 0xb4, 0x2b, 0x20, 0x82, 0x40, 0x24, 0x85, 0x11, 0x06, 0xed, 0xcf, - 0x0a, 0xc1, 0x08, 0x65, 0x0d, 0x16, 0x4e, 0x7c, 0x6e, 0x0f, 0xce, 0xe5, 0xd6, 0x94, 0x29, 0xf6, - 0x4e, 0xac, 0xcc, 0x0f, 0xc4, 0x82, 0x8f, 0xf8, 0x10, 0xe9, 0xb3, 0x64, 0x2e, 0x4a, 0xf8, 0xb6, - 0x04, 0x8b, 0xa3, 0xc2, 0x3e, 0xb1, 0xdd, 0xa1, 0xe7, 0xf2, 0xa1, 0xd4, 0x0e, 0x62, 0x80, 0x71, - 0x04, 0x6b, 0xb3, 0xe3, 0x93, 0x9b, 0xf9, 0x03, 0x6d, 0x33, 0x93, 0x58, 0xbe, 0x71, 0x3d, 0x01, - 0x69, 0x1b, 0xfb, 0xaf, 0xe7, 0x21, 0x2f, 0xc4, 0xb4, 0x6b, 0x25, 0x3a, 0x5d, 0xee, 0xce, 0xcd, - 0xf9, 0x87, 0xd0, 0x66, 0x40, 0xe7, 0x37, 0x19, 0xa6, 0xca, 0x08, 0xc1, 0x73, 0x3b, 0xca, 0xf6, - 0xf9, 0xe0, 0x42, 0x5a, 0xa6, 0x28, 0xdb, 0xe4, 0x83, 0x0b, 0x54, 0x83, 0xec, 0x90, 0xca, 0xd2, - 0x66, 0x2c, 0x06, 0x76, 0x88, 0x25, 0x65, 0x16, 0x96, 0x2b, 0x46, 0x59, 0x58, 0xaa, 0x09, 0x45, - 0xc7, 0x3d, 0xf1, 0xa6, 0xee, 0x10, 0xf7, 0x5e, 0xc9, 0x54, 0x49, 0x74, 0x47, 0x21, 0x9b, 0x10, - 0xa7, 0x04, 0x6d, 0xb5, 0x92, 0x00, 0xf4, 0xc5, 0x39, 0xf1, 0x3e, 0x94, 0x83, 0x2b, 0x77, 0xa0, - 0x6f, 0xb0, 0x15, 0x39, 0x3f, 0x62, 0xf4, 0x9b, 0xbd, 0x2b, 0x77, 0x80, 0xdb, 0xa9, 0x14, 0xc8, - 0x5f, 0xec, 0x31, 0x94, 0x22, 0x03, 0x2e, 0xb1, 0xc7, 0x9b, 0x7a, 0x09, 0x65, 0xb5, 0x25, 0x3d, - 0x39, 0x42, 0x65, 0x0f, 0x60, 0x01, 0xad, 0xac, 0x41, 0xb3, 0x8a, 0x85, 0x94, 0x30, 0x2e, 0xba, - 0x81, 0x9e, 0x20, 0x3e, 0x44, 0x8b, 0xab, 0x29, 0xd1, 0x36, 0x9e, 0x40, 0x2d, 0x51, 0x97, 0xae, - 0xf7, 0xd6, 0x48, 0xef, 0x7d, 0x43, 0xd7, 0x7b, 0x63, 0x36, 0x2d, 0x8b, 0xe9, 0x7a, 0xf0, 0xcf, - 0x43, 0x49, 0x0d, 0x45, 0x6c, 0xa2, 0xe3, 0xee, 0x93, 0xee, 0xe1, 0x67, 0x5d, 0xab, 0xf7, 0x79, - 0x77, 0xbb, 0x71, 0x83, 0x2d, 0x42, 0xa5, 0xb5, 0x8d, 0xfb, 0x12, 0x01, 0x19, 0x81, 0x72, 0xd4, - 0xea, 0xf5, 0x22, 0x48, 0xd6, 0xd8, 0x85, 0xc6, 0x6c, 0x4f, 0x05, 0x4d, 0x86, 0x0a, 0x26, 0x6d, - 0xd0, 0x31, 0x40, 0xe8, 0x2f, 0x64, 0x56, 0x26, 0x21, 0x99, 0x12, 0xc6, 0x63, 0x68, 0x88, 0x43, - 0x47, 0x4c, 0x95, 0xee, 0x5d, 0x1a, 0x09, 0xc1, 0x4b, 0xb7, 0x43, 0x97, 0xcc, 0x0a, 0xc1, 0xb0, - 0x29, 0xe3, 0x03, 0x58, 0xd2, 0x8a, 0xc5, 0xfa, 0xa6, 0x38, 0xc8, 0x66, 0xf5, 0x4d, 0xd4, 0x2e, - 0x28, 0xc7, 0x58, 0x87, 0x55, 0x91, 0x6c, 0x5f, 0x70, 0x37, 0xec, 0x4d, 0x4f, 0xc8, 0x29, 0xe9, - 0x78, 0xae, 0xd0, 0x3a, 0xca, 0x51, 0xce, 0xf5, 0x44, 0xbe, 0x29, 0x55, 0xd3, 0x2c, 0x92, 0xc6, - 0x86, 0xd6, 0x02, 0x16, 0xdc, 0xc4, 0xbf, 0x09, 0x15, 0xb5, 0x1c, 0x81, 0xc4, 0xb4, 0x1e, 0xb5, - 0xdb, 0xa6, 0x75, 0xd8, 0xdd, 0xef, 0x74, 0x05, 0xb7, 0x13, 0xd3, 0x8a, 0x80, 0xdd, 0x5d, 0x84, - 0x64, 0x8c, 0x06, 0xd4, 0x3f, 0xe6, 0x61, 0xc7, 0x3d, 0xf5, 0xe4, 0x64, 0x18, 0x7f, 0x65, 0x01, - 0x16, 0x23, 0x50, 0xac, 0xe2, 0x5e, 0x70, 0x3f, 0x70, 0x3c, 0x17, 0xa5, 0xd5, 0xb2, 0xa9, 0x92, - 0x82, 0x3b, 0x49, 0x19, 0x1d, 0x8f, 0xc0, 0x15, 0xcc, 0x95, 0x52, 0x3d, 0x9e, 0x7f, 0x6f, 0xc3, - 0xa2, 0x33, 0xe4, 0x6e, 0xe8, 0x84, 0x57, 0x56, 0xc2, 0xb8, 0x56, 0x57, 0x60, 0x79, 0x06, 0xae, - 0x40, 0xc1, 0x1e, 0x39, 0xb6, 0x72, 0xf6, 0x52, 0x42, 0x40, 0x07, 0xde, 0xc8, 0xf3, 0x51, 0x72, - 0x2d, 0x9b, 0x94, 0x60, 0x0f, 0x61, 0x45, 0x48, 0xd0, 0xba, 0xc5, 0x13, 0x19, 0x0c, 0xd9, 0xf9, - 0x98, 0x3b, 0x1d, 0x1f, 0xc5, 0x56, 0x4f, 0x91, 0x23, 0x4e, 0x3e, 0x51, 0x42, 0x8a, 0x3a, 0x51, - 0x01, 0x52, 0xc6, 0x96, 0xdc, 0xe9, 0xb8, 0x85, 0x39, 0x11, 0xfe, 0x23, 0x58, 0x15, 0xf8, 0x91, - 0x70, 0x14, 0x95, 0x58, 0xc4, 0x12, 0xa2, 0xb2, 0x8e, 0xcc, 0x8b, 0xca, 0xdc, 0x82, 0x32, 0xf5, - 0x4a, 0x90, 0x44, 0x81, 0x84, 0x70, 0xec, 0x0a, 0xf7, 0x83, 0x39, 0xbf, 0xec, 0x02, 0x1d, 0xe3, - 0x33, 0x7e, 0x59, 0xcd, 0xb3, 0x5b, 0x9a, 0xf5, 0xec, 0x3e, 0x82, 0xd5, 0x13, 0x41, 0xa3, 0xe7, - 0xdc, 0x1e, 0x72, 0xdf, 0x8a, 0x29, 0x9f, 0x94, 0x8d, 0x65, 0x91, 0xb9, 0x87, 0x79, 0xd1, 0x46, - 0x11, 0x52, 0x8a, 0xe0, 0x1b, 0x7c, 0x68, 0x85, 0x9e, 0x85, 0xc2, 0x0b, 0x72, 0xa0, 0x92, 0x59, - 0x23, 0x70, 0xdf, 0xdb, 0x16, 0xc0, 0x24, 0xde, 0x99, 0x6f, 0x4f, 0xce, 0xa5, 0x3a, 0x10, 0xe1, - 0x7d, 0x2c, 0x80, 0xec, 0x15, 0x28, 0x8a, 0x3d, 0xe1, 0x72, 0x72, 0x73, 0x91, 0xc0, 0xad, 0x40, - 0xec, 0x0d, 0x58, 0xc0, 0x36, 0x82, 0x66, 0x03, 0x37, 0x44, 0x35, 0xe6, 0xf4, 0x8e, 0x6b, 0xca, - 0x3c, 0x21, 0x0a, 0x4e, 0x7d, 0x87, 0xd8, 0x50, 0xd9, 0xc4, 0xdf, 0xec, 0x87, 0x1a, 0x4f, 0x5b, - 0xc6, 0xb2, 0x6f, 0xc8, 0xb2, 0x33, 0xa4, 0x78, 0x1d, 0x7b, 0xfb, 0x46, 0xb9, 0xd5, 0x8f, 0xf2, - 0xa5, 0x4a, 0xa3, 0x6a, 0x7c, 0x08, 0x05, 0x9a, 0x1d, 0x41, 0x84, 0x38, 0x77, 0x19, 0x49, 0x84, - 0x08, 0x6d, 0x42, 0xd1, 0xe5, 0xe1, 0x33, 0xcf, 0x7f, 0xaa, 0xcc, 0xcf, 0x32, 0x69, 0xfc, 0x04, - 0x6d, 0x21, 0x91, 0xcf, 0x9e, 0xd4, 0x3a, 0x41, 0x1e, 0xb4, 0xbc, 0xc1, 0xb9, 0x2d, 0xcd, 0x33, - 0x25, 0x04, 0xf4, 0xce, 0xed, 0x39, 0xf2, 0xc8, 0xce, 0xbb, 0xed, 0xdf, 0x80, 0xba, 0x8a, 0x12, - 0x08, 0xac, 0x11, 0x3f, 0x0d, 0x25, 0xb9, 0x57, 0x65, 0x88, 0x40, 0xb0, 0xcf, 0x4f, 0x43, 0xe3, - 0x00, 0x96, 0x24, 0x41, 0x1e, 0x4e, 0xb8, 0x6a, 0xfa, 0xbb, 0x69, 0xd2, 0x70, 0xe5, 0xd1, 0x72, - 0xf2, 0x24, 0xa6, 0xe8, 0x87, 0x84, 0x88, 0x6c, 0x7c, 0x02, 0x4c, 0x3f, 0xa7, 0x65, 0x7d, 0x52, - 0x26, 0x55, 0x56, 0x7b, 0xe5, 0xfc, 0x8a, 0x24, 0x5f, 0x67, 0x28, 0x66, 0x27, 0x98, 0x0e, 0x06, - 0x2a, 0x7a, 0xa3, 0x64, 0xaa, 0xa4, 0xf1, 0x07, 0x19, 0x58, 0xc6, 0xca, 0x94, 0x34, 0x2f, 0xb9, - 0xf0, 0x4f, 0xdd, 0x49, 0xb1, 0x3e, 0xba, 0x70, 0x44, 0x89, 0xaf, 0x6f, 0x11, 0xcd, 0xcf, 0x59, - 0x44, 0xdf, 0x81, 0xc6, 0x90, 0x8f, 0x9c, 0x0b, 0xee, 0x5f, 0x45, 0x8a, 0x1c, 0xc9, 0xef, 0x8b, - 0x0a, 0x2e, 0x75, 0x39, 0xe3, 0xef, 0x64, 0x60, 0x89, 0x44, 0x19, 0xd4, 0x8a, 0xe5, 0x44, 0x7d, - 0xa4, 0xd4, 0x40, 0xc9, 0xaa, 0xe4, 0x98, 0xe2, 0x23, 0x1e, 0xa1, 0x84, 0xbc, 0x77, 0x43, 0xaa, - 0x87, 0x12, 0xca, 0xbe, 0x8f, 0x1a, 0x88, 0x6b, 0x21, 0x50, 0x3a, 0x33, 0x6f, 0xa6, 0x08, 0x4f, - 0x51, 0x71, 0xa1, 0x9e, 0xb8, 0x08, 0xda, 0x2a, 0x09, 0xbd, 0x54, 0x80, 0x8d, 0x5d, 0xa8, 0x25, - 0x9a, 0x49, 0x18, 0x68, 0xab, 0x64, 0xa0, 0x9d, 0x73, 0x98, 0x64, 0xe7, 0x1d, 0x26, 0x57, 0xb0, - 0x6c, 0x72, 0x7b, 0x78, 0xb5, 0xeb, 0xf9, 0x47, 0xc1, 0x49, 0xb8, 0x4b, 0xf2, 0xa1, 0xe0, 0xef, - 0x91, 0x17, 0x30, 0x61, 0x05, 0x55, 0xce, 0x20, 0xa5, 0xec, 0xbe, 0x09, 0xf5, 0xd8, 0x5d, 0xa8, - 0x59, 0xd2, 0x6a, 0x91, 0xc7, 0x10, 0x0d, 0x6a, 0x42, 0x51, 0x0c, 0x4e, 0x42, 0x69, 0x4b, 0xc3, - 0xdf, 0xc6, 0x5f, 0xca, 0x03, 0x13, 0xd4, 0x3c, 0x43, 0x30, 0x33, 0x8e, 0xce, 0xec, 0x9c, 0xa3, - 0xf3, 0x21, 0x30, 0x0d, 0x41, 0xf9, 0x5f, 0x73, 0x91, 0xff, 0xb5, 0x11, 0xe3, 0x4a, 0xf7, 0xeb, - 0x43, 0x58, 0x91, 0xc2, 0x76, 0xb2, 0xab, 0x44, 0x1a, 0x8c, 0xa4, 0xee, 0x44, 0x7f, 0x95, 0x93, - 0x53, 0x28, 0xef, 0x64, 0x2b, 0x43, 0x27, 0xa7, 0x52, 0xdb, 0x35, 0x02, 0x5c, 0x78, 0x21, 0x01, - 0x16, 0xe7, 0x08, 0x50, 0x33, 0xdd, 0x94, 0x92, 0xa6, 0x1b, 0x03, 0x6a, 0xca, 0x95, 0x49, 0x11, - 0x1c, 0x24, 0x59, 0x56, 0xa4, 0x3f, 0x13, 0xa3, 0x38, 0xee, 0x41, 0x43, 0xd9, 0x57, 0x22, 0xe3, - 0x10, 0x45, 0x27, 0x48, 0xf3, 0xdc, 0xb6, 0x32, 0x11, 0x25, 0x4c, 0xf1, 0x95, 0x19, 0x53, 0xfc, - 0xbb, 0xb0, 0x14, 0x08, 0xfa, 0xb5, 0xa6, 0xae, 0x0c, 0x51, 0xe2, 0x43, 0xd4, 0xc3, 0x4a, 0x66, - 0x03, 0x33, 0x8e, 0x63, 0xf8, 0xbc, 0xe1, 0xa3, 0x96, 0x62, 0xf8, 0x78, 0x1c, 0x7b, 0xfd, 0x82, - 0x73, 0x67, 0x8c, 0x42, 0x45, 0x1c, 0x76, 0x23, 0x27, 0xb8, 0x77, 0xee, 0x8c, 0x4d, 0xe5, 0x62, - 0x16, 0x09, 0xe3, 0x7f, 0x67, 0xa0, 0x21, 0xe8, 0x20, 0xb1, 0xc5, 0xbe, 0x07, 0xc8, 0x0c, 0x5e, - 0x72, 0x87, 0x55, 0x04, 0xae, 0xda, 0x60, 0x1f, 0x02, 0xee, 0x18, 0x4b, 0x28, 0x9d, 0x72, 0x7f, - 0x35, 0x93, 0xfb, 0x2b, 0xe6, 0xa1, 0x7b, 0x37, 0x48, 0x39, 0x11, 0x10, 0xf6, 0x3d, 0x28, 0x0b, - 0xc2, 0x44, 0x2a, 0x91, 0x51, 0x64, 0x4a, 0x34, 0x4b, 0xd9, 0x23, 0xa2, 0xe8, 0x44, 0x26, 0xd3, - 0x1c, 0xb5, 0xf9, 0x14, 0x47, 0xad, 0xb6, 0x81, 0xf7, 0x00, 0x9e, 0xf0, 0xab, 0x7d, 0x6f, 0x80, - 0x2a, 0xf1, 0x6d, 0x00, 0x41, 0xcb, 0xa7, 0xf6, 0xd8, 0x91, 0x16, 0x9d, 0x82, 0x59, 0x7e, 0xca, - 0xaf, 0x76, 0x11, 0x20, 0x16, 0x52, 0x64, 0xc7, 0xbb, 0xb8, 0x60, 0x96, 0x9e, 0xf2, 0x2b, 0xda, - 0xc2, 0x16, 0xd4, 0x9e, 0xf0, 0xab, 0x1d, 0x4e, 0x52, 0xa8, 0xe7, 0x0b, 0x22, 0xf2, 0xed, 0x67, - 0x42, 0xec, 0x4c, 0x38, 0x59, 0x2b, 0xbe, 0xfd, 0xec, 0x09, 0xbf, 0x52, 0x0e, 0xdf, 0xa2, 0xc8, - 0x1f, 0x79, 0x03, 0x79, 0x6e, 0xaa, 0x70, 0x91, 0xb8, 0x53, 0xe6, 0xc2, 0x53, 0xfc, 0x6d, 0xfc, - 0x69, 0x06, 0x6a, 0xa2, 0xff, 0xc8, 0x96, 0xc5, 0x92, 0xa9, 0xa8, 0xa3, 0x4c, 0x1c, 0x75, 0xf4, - 0x48, 0x72, 0x35, 0xe2, 0xf1, 0xd9, 0xeb, 0x79, 0x3c, 0xae, 0x0d, 0x31, 0xf8, 0xf7, 0xa1, 0x4c, - 0xdb, 0x52, 0xec, 0xf3, 0x5c, 0x62, 0x81, 0x13, 0x03, 0x32, 0x4b, 0x88, 0xf6, 0x84, 0x82, 0x1c, - 0x34, 0xeb, 0x20, 0x4d, 0x71, 0xd9, 0x8f, 0x6c, 0x82, 0x29, 0xcb, 0x50, 0xb8, 0x26, 0xc8, 0x41, - 0x37, 0xbd, 0x2d, 0xcc, 0x99, 0xde, 0x0e, 0xa1, 0x24, 0x96, 0x1a, 0x07, 0x9b, 0x52, 0x69, 0x26, - 0xad, 0x52, 0x21, 0x09, 0xd8, 0xe2, 0x50, 0x10, 0x8c, 0x2e, 0x2b, 0x25, 0x01, 0x3b, 0xe0, 0x47, - 0xc8, 0xec, 0x32, 0x50, 0xd1, 0x76, 0x00, 0x5a, 0x2f, 0xa3, 0xf9, 0xa2, 0xed, 0x92, 0x24, 0xf1, - 0xc4, 0x84, 0xef, 0xdd, 0x30, 0x6b, 0x83, 0xc4, 0x0a, 0x6c, 0x4a, 0x5a, 0xc5, 0x92, 0xd9, 0x44, - 0x80, 0x94, 0xea, 0xb8, 0x22, 0x50, 0xf1, 0x7b, 0x6b, 0x01, 0xf2, 0x02, 0xd5, 0xf8, 0x08, 0x96, - 0xb4, 0x6e, 0x90, 0x1d, 0xe0, 0x65, 0x47, 0x68, 0xfc, 0x52, 0x54, 0x58, 0xb4, 0x41, 0xfe, 0x25, - 0x15, 0x30, 0xc2, 0x87, 0x34, 0x70, 0x19, 0x98, 0x42, 0x20, 0x81, 0xf6, 0xd2, 0x41, 0x0c, 0xbf, - 0x02, 0xcb, 0x5a, 0xed, 0xbb, 0x8e, 0x6b, 0x8f, 0x9c, 0x9f, 0xe0, 0x81, 0x1f, 0x38, 0x67, 0xee, - 0x4c, 0xfd, 0x04, 0xfa, 0x5a, 0xf5, 0xff, 0xdd, 0x2c, 0xac, 0xc8, 0x06, 0x30, 0x04, 0xd0, 0x11, - 0x52, 0xdc, 0x41, 0x70, 0xc6, 0xbe, 0x07, 0x35, 0x31, 0x37, 0x96, 0xcf, 0xcf, 0x9c, 0x20, 0xe4, - 0xca, 0xaf, 0x95, 0xc2, 0xb8, 0xc4, 0x61, 0x2e, 0x50, 0x4d, 0x89, 0xc9, 0x3e, 0x82, 0x0a, 0x16, - 0x25, 0x3b, 0x8b, 0x5c, 0x88, 0xe6, 0x7c, 0x41, 0x9a, 0xe8, 0xbd, 0x1b, 0x26, 0x04, 0xf1, 0xb4, - 0x7f, 0x04, 0x15, 0x5c, 0xc3, 0x0b, 0x9c, 0xc8, 0x19, 0x56, 0x35, 0x37, 0xd1, 0xa2, 0xf0, 0x24, - 0x9e, 0xf6, 0x16, 0xd4, 0x88, 0x59, 0xc9, 0x79, 0x92, 0xa1, 0x45, 0x1b, 0xf3, 0xc5, 0xd5, 0x4c, - 0x8a, 0xce, 0x4f, 0xb4, 0xf4, 0x56, 0x19, 0x8a, 0xa1, 0xef, 0x9c, 0x9d, 0x71, 0xdf, 0x58, 0x8b, - 0xa6, 0x46, 0x70, 0x61, 0xde, 0x0b, 0xf9, 0x44, 0xc8, 0xe6, 0xc6, 0xbf, 0xcf, 0x40, 0x45, 0xf2, - 0xd5, 0x9f, 0xda, 0x99, 0xb6, 0xa1, 0xc5, 0xe6, 0x92, 0x49, 0x27, 0x0e, 0xc5, 0x7d, 0x1b, 0x16, - 0xc7, 0x42, 0x4e, 0x17, 0x7a, 0x64, 0xc2, 0x93, 0x56, 0x57, 0x60, 0x29, 0x26, 0x6f, 0xc2, 0x32, - 0x4a, 0xcd, 0x81, 0x15, 0x3a, 0x23, 0x4b, 0x65, 0xca, 0x38, 0xd8, 0x25, 0xca, 0xea, 0x3b, 0xa3, - 0x03, 0x99, 0x21, 0x84, 0xc7, 0x20, 0xb4, 0xcf, 0xb8, 0xdc, 0xdb, 0x94, 0x30, 0x9a, 0xb0, 0x36, - 0xa3, 0x42, 0x2a, 0xfd, 0xf8, 0xff, 0x2e, 0xc1, 0xfa, 0x5c, 0x96, 0xd4, 0x93, 0x23, 0x0f, 0xd2, - 0xc8, 0x19, 0x9f, 0x78, 0x91, 0x7d, 0x35, 0xa3, 0x79, 0x90, 0xf6, 0x45, 0x8e, 0xb2, 0xaf, 0x72, - 0x58, 0x55, 0x04, 0x89, 0x06, 0xd2, 0x48, 0xcb, 0xcc, 0xa2, 0x0e, 0xf4, 0x7e, 0xf2, 0x10, 0x9b, - 0x6d, 0x4e, 0xc1, 0x75, 0xd1, 0x68, 0x79, 0x32, 0x07, 0x0b, 0xd8, 0xaf, 0x41, 0x33, 0xa2, 0x7b, - 0x29, 0xb6, 0x6b, 0x2a, 0xb3, 0x68, 0xe9, 0xbd, 0x17, 0xb4, 0x94, 0x30, 0xee, 0xa1, 0xec, 0xb4, - 0xa6, 0xb6, 0x0c, 0x55, 0x18, 0xb5, 0x75, 0x01, 0xaf, 0xaa, 0xb6, 0x50, 0x0c, 0x9f, 0x6f, 0x31, - 0xff, 0x52, 0x63, 0x43, 0xc3, 0x65, 0xa2, 0x59, 0xf3, 0x96, 0xac, 0x38, 0xca, 0xd2, 0xdb, 0x3d, - 0x87, 0xb5, 0x67, 0xb6, 0x13, 0xaa, 0x31, 0x6a, 0x1a, 0x7b, 0x01, 0xdb, 0x7b, 0xf4, 0x82, 0xf6, - 0x3e, 0xa3, 0xc2, 0x09, 0xc5, 0x64, 0xe5, 0xd9, 0x3c, 0x30, 0xd8, 0xf8, 0x47, 0x39, 0xa8, 0x27, - 0x6b, 0x11, 0x8c, 0x45, 0x1e, 0x36, 0x4a, 0xde, 0x94, 0x42, 0xb0, 0xb4, 0xfd, 0x77, 0x49, 0xce, - 0x9c, 0xf7, 0x4a, 0x64, 0x53, 0xbc, 0x12, 0xba, 0x33, 0x20, 0xf7, 0x22, 0xef, 0x6b, 0xfe, 0xa5, - 0xbc, 0xaf, 0x85, 0x34, 0xef, 0xeb, 0xf5, 0x2e, 0xbb, 0x85, 0x9f, 0xca, 0x65, 0x57, 0x7c, 0xae, - 0xcb, 0x4e, 0x73, 0x34, 0x96, 0xae, 0x31, 0xe1, 0x6b, 0xae, 0xc7, 0x14, 0x97, 0x5d, 0xf9, 0x6b, - 0xb8, 0xec, 0x36, 0xfe, 0x34, 0x03, 0x6c, 0x7e, 0x77, 0xb0, 0x8f, 0xc9, 0xe1, 0xe3, 0xf2, 0x91, - 0xe4, 0xdc, 0xdf, 0x7a, 0xb9, 0x1d, 0xa6, 0x08, 0x42, 0x95, 0x66, 0x0f, 0x60, 0x59, 0x8f, 0xd6, - 0xd7, 0xb5, 0xf6, 0x9a, 0xc9, 0xf4, 0xac, 0xd8, 0xb6, 0xa3, 0xb9, 0xba, 0xf3, 0x2f, 0x74, 0x75, - 0x17, 0x5e, 0xe8, 0xea, 0x5e, 0x48, 0xba, 0xba, 0x37, 0xfe, 0x53, 0x06, 0x96, 0x53, 0x88, 0xf8, - 0x9b, 0x1b, 0xb3, 0xa0, 0xbd, 0x04, 0x5b, 0xcb, 0x4a, 0xda, 0xd3, 0x39, 0xda, 0xbe, 0xb2, 0x07, - 0x8a, 0xa5, 0x08, 0xe4, 0x49, 0x75, 0xff, 0x45, 0xdc, 0x25, 0x2e, 0x61, 0xea, 0xc5, 0x37, 0x7e, - 0x3b, 0x0b, 0x15, 0x2d, 0x53, 0xcc, 0x22, 0x91, 0xac, 0x16, 0x61, 0x44, 0x92, 0x21, 0xda, 0x1c, - 0xee, 0x80, 0xf4, 0x7a, 0x50, 0x3e, 0x6d, 0x2e, 0x29, 0x06, 0x22, 0xc2, 0x26, 0x2c, 0x2b, 0x67, - 0x1c, 0x8f, 0x83, 0x0e, 0xe5, 0x59, 0xb3, 0x24, 0x5d, 0x72, 0x3c, 0x8a, 0x61, 0x64, 0x0f, 0x94, - 0x3a, 0x18, 0xaf, 0x1d, 0x92, 0x3a, 0xb9, 0x14, 0x96, 0x68, 0x83, 0xa8, 0x45, 0x14, 0x74, 0xfe, - 0x3e, 0xac, 0xaa, 0xed, 0x91, 0x2c, 0x41, 0x5e, 0x06, 0x26, 0x37, 0x87, 0x5e, 0xe4, 0x87, 0x70, - 0x7b, 0xa6, 0x4f, 0x33, 0x45, 0x29, 0x3a, 0xf6, 0x66, 0xa2, 0x77, 0x7a, 0x0d, 0x1b, 0x5f, 0x42, - 0x2d, 0xc1, 0x28, 0xbf, 0xb9, 0x25, 0x9f, 0xb5, 0xf3, 0xd0, 0x8c, 0xea, 0x76, 0x9e, 0x8d, 0xff, - 0x95, 0x03, 0x36, 0xcf, 0xab, 0x7f, 0x96, 0x5d, 0x98, 0x27, 0xcc, 0x5c, 0x0a, 0x61, 0xfe, 0x7f, - 0x93, 0x1f, 0xde, 0x85, 0x25, 0x9f, 0x0f, 0xbc, 0x0b, 0xee, 0x6b, 0x1e, 0x55, 0xda, 0x9c, 0x8d, - 0x28, 0x43, 0xf5, 0xe2, 0xc3, 0xd9, 0xc8, 0x8e, 0x52, 0xe2, 0xc2, 0x89, 0x26, 0x40, 0xcd, 0x04, - 0x78, 0x1c, 0xc3, 0x82, 0xed, 0x0e, 0xce, 0x3d, 0x5f, 0xf2, 0xc1, 0x9f, 0xfb, 0xda, 0xc7, 0xe7, - 0x66, 0x0b, 0xcb, 0xa3, 0xd4, 0x66, 0xca, 0xca, 0x8c, 0xf7, 0xa1, 0xa2, 0x81, 0x59, 0x19, 0x0a, - 0xfb, 0x9d, 0x83, 0xad, 0xc3, 0xc6, 0x0d, 0x56, 0x83, 0xb2, 0xd9, 0xde, 0x3e, 0xfc, 0xb4, 0x6d, - 0xb6, 0x77, 0x1a, 0x19, 0x56, 0x82, 0xfc, 0xfe, 0x61, 0xaf, 0xdf, 0xc8, 0x1a, 0x1b, 0xd0, 0x94, - 0x35, 0xce, 0x3b, 0x35, 0x7e, 0x23, 0x1f, 0x99, 0x0b, 0x31, 0x53, 0xaa, 0xe8, 0xdf, 0x86, 0xaa, - 0x2e, 0xde, 0x48, 0x8a, 0x98, 0x71, 0xea, 0x0b, 0xe5, 0xdc, 0xd3, 0x78, 0xf5, 0x36, 0x90, 0x4b, - 0x77, 0x18, 0x15, 0xcb, 0x26, 0xe4, 0xd6, 0x14, 0xf7, 0x21, 0x2a, 0x3f, 0x09, 0x32, 0xfc, 0x73, - 0x50, 0x4f, 0x1a, 0xf0, 0x25, 0x47, 0x4a, 0x53, 0x38, 0x45, 0xe9, 0x84, 0x45, 0x9f, 0xfd, 0x10, - 0x1a, 0xb3, 0x0e, 0x00, 0x29, 0x3c, 0x5f, 0x53, 0x7e, 0xd1, 0x49, 0xfa, 0x04, 0xd8, 0x1e, 0xac, - 0xa4, 0x09, 0x78, 0x48, 0x1f, 0xd7, 0x1b, 0x29, 0xd8, 0xbc, 0x10, 0xc7, 0xbe, 0x2b, 0x1d, 0x41, - 0x05, 0x5c, 0xfe, 0x37, 0x92, 0xed, 0x6b, 0x93, 0xbd, 0x49, 0xff, 0x34, 0x97, 0xd0, 0x05, 0x40, - 0x0c, 0x63, 0x0d, 0xa8, 0x1e, 0x1e, 0xb5, 0xbb, 0xd6, 0xf6, 0x5e, 0xab, 0xdb, 0x6d, 0xef, 0x37, - 0x6e, 0x30, 0x06, 0x75, 0x74, 0x66, 0xef, 0x44, 0xb0, 0x8c, 0x80, 0x49, 0x87, 0x9c, 0x82, 0x65, - 0xd9, 0x0a, 0x34, 0x3a, 0xdd, 0x19, 0x68, 0x8e, 0x35, 0x61, 0xe5, 0xa8, 0x4d, 0xfe, 0xef, 0x44, - 0xbd, 0x79, 0xa1, 0x34, 0xc8, 0xe1, 0x0a, 0xa5, 0xe1, 0x33, 0x7b, 0x34, 0xe2, 0xa1, 0xdc, 0x07, - 0x4a, 0x96, 0xfe, 0xcd, 0x0c, 0xac, 0xce, 0x64, 0xc4, 0x77, 0x43, 0x48, 0x92, 0x4e, 0xca, 0xd0, - 0x55, 0x04, 0xaa, 0xdd, 0xf4, 0x2e, 0x2c, 0x45, 0x86, 0xa7, 0x99, 0x53, 0xa9, 0x11, 0x65, 0x28, - 0xe4, 0x07, 0xb0, 0xac, 0xd9, 0xaf, 0x66, 0x78, 0x05, 0xd3, 0xb2, 0x64, 0x01, 0x63, 0x3d, 0x8a, - 0xc1, 0x9f, 0xe9, 0xf5, 0x10, 0xd6, 0x66, 0x33, 0x62, 0x3f, 0x59, 0xb2, 0xbf, 0x2a, 0xc9, 0x1e, - 0xce, 0x10, 0x42, 0xb2, 0xb7, 0xfa, 0x82, 0xab, 0xe6, 0x7f, 0x67, 0x01, 0xd8, 0x27, 0x53, 0xee, - 0x5f, 0xe1, 0xdd, 0x8f, 0xe0, 0x45, 0x01, 0x8e, 0xca, 0xd2, 0x92, 0x7d, 0xa9, 0xfb, 0x5d, 0x69, - 0xf7, 0xab, 0xf2, 0x2f, 0xbe, 0x5f, 0x55, 0x78, 0xd1, 0xfd, 0xaa, 0xd7, 0xa1, 0xe6, 0x9c, 0xb9, - 0x9e, 0x60, 0x85, 0x42, 0x12, 0x0e, 0x9a, 0x0b, 0x77, 0x73, 0xf7, 0xaa, 0x66, 0x55, 0x02, 0x85, - 0x1c, 0x1c, 0xb0, 0x8f, 0x62, 0x24, 0x3e, 0x3c, 0xc3, 0x3b, 0x86, 0x3a, 0x13, 0x6c, 0x0f, 0xcf, - 0xb8, 0x34, 0x2c, 0xa1, 0xa6, 0xa1, 0x0a, 0x0b, 0x78, 0xc0, 0xde, 0x80, 0x7a, 0xe0, 0x4d, 0x85, - 0x62, 0xa1, 0xa6, 0x81, 0x1c, 0x65, 0x55, 0x82, 0x1e, 0x29, 0xb7, 0xe9, 0xf2, 0x34, 0xe0, 0xd6, - 0xd8, 0x09, 0x02, 0x21, 0x9e, 0x0d, 0x3c, 0x37, 0xf4, 0xbd, 0x91, 0xf4, 0x7d, 0x2d, 0x4d, 0x03, - 0x7e, 0x40, 0x39, 0xdb, 0x94, 0xc1, 0xbe, 0x13, 0x77, 0x69, 0x62, 0x3b, 0x7e, 0xd0, 0x04, 0xec, - 0x92, 0x1a, 0x29, 0xca, 0xef, 0xb6, 0xe3, 0x47, 0x7d, 0x11, 0x89, 0x60, 0xe6, 0xde, 0x57, 0x65, - 0xf6, 0xde, 0xd7, 0xaf, 0xa6, 0xdf, 0xfb, 0xaa, 0x61, 0xd5, 0x0f, 0x65, 0xd5, 0xf3, 0x4b, 0xfc, - 0xb5, 0xae, 0x7f, 0xcd, 0x5f, 0x67, 0xab, 0x7f, 0x9d, 0xeb, 0x6c, 0x8b, 0x69, 0xd7, 0xd9, 0xde, - 0x87, 0x0a, 0x5e, 0x34, 0xb2, 0xce, 0x1d, 0x21, 0xc3, 0x91, 0x2f, 0xaf, 0xa1, 0xdf, 0x44, 0xda, - 0x73, 0xdc, 0xd0, 0x04, 0x5f, 0xfd, 0x0c, 0xe6, 0x6f, 0x96, 0x2d, 0xfd, 0x0c, 0x6f, 0x96, 0xc9, - 0x0b, 0x51, 0x9b, 0x50, 0x52, 0xeb, 0xc4, 0x18, 0xe4, 0x4f, 0x7d, 0x6f, 0xac, 0x7c, 0x1c, 0xe2, - 0x37, 0xab, 0x43, 0x36, 0xf4, 0x64, 0xe1, 0x6c, 0xe8, 0x19, 0xbf, 0x0c, 0x15, 0x8d, 0xd4, 0xd8, - 0x6b, 0x64, 0x97, 0x14, 0xba, 0x99, 0x94, 0x2d, 0x69, 0x16, 0xcb, 0x12, 0xda, 0x19, 0x0a, 0x7e, - 0x33, 0x74, 0x7c, 0x8e, 0x77, 0x40, 0x2d, 0x9f, 0x5f, 0x70, 0x3f, 0x50, 0x3e, 0xa7, 0x46, 0x94, - 0x61, 0x12, 0xdc, 0xf8, 0x15, 0x58, 0x4e, 0xac, 0xad, 0x64, 0x11, 0x6f, 0xc0, 0x02, 0xce, 0x9b, - 0x0a, 0x1a, 0x48, 0xde, 0xf0, 0x92, 0x79, 0x78, 0xdf, 0x95, 0xdc, 0x65, 0xd6, 0xc4, 0xf7, 0x4e, - 0xb0, 0x91, 0x8c, 0x59, 0x91, 0xb0, 0x23, 0xdf, 0x3b, 0x31, 0xfe, 0x28, 0x07, 0xb9, 0x3d, 0x6f, - 0xa2, 0x07, 0xb1, 0x65, 0xe6, 0x82, 0xd8, 0xa4, 0xc2, 0x69, 0x45, 0x0a, 0xa5, 0x94, 0xd9, 0xd1, - 0x51, 0xa4, 0x94, 0xca, 0x7b, 0x50, 0x17, 0x7c, 0x22, 0xf4, 0x84, 0xc6, 0xfe, 0xcc, 0xf6, 0x49, - 0x20, 0xce, 0xd1, 0xe6, 0xb3, 0xc7, 0x61, 0xdf, 0xdb, 0x25, 0x38, 0x5b, 0x81, 0x5c, 0xa4, 0xbe, - 0x60, 0xb6, 0x48, 0xb2, 0x35, 0x58, 0xc0, 0x68, 0xe6, 0x2b, 0xe9, 0xf4, 0x96, 0x29, 0xf6, 0x2d, - 0x58, 0x4e, 0xd6, 0x4b, 0xac, 0x48, 0xca, 0x46, 0x7a, 0xc5, 0xc8, 0x93, 0x6e, 0x82, 0xe0, 0x23, - 0x84, 0x23, 0x83, 0x6b, 0x4e, 0x39, 0xc7, 0x2c, 0x8d, 0xe9, 0x95, 0x12, 0x4c, 0xef, 0x0e, 0x54, - 0xc2, 0xd1, 0x85, 0x35, 0xb1, 0xaf, 0x46, 0x9e, 0x3d, 0x94, 0xfb, 0x1b, 0xc2, 0xd1, 0xc5, 0x11, - 0x41, 0xd8, 0x03, 0x80, 0xf1, 0x64, 0x22, 0xf7, 0x1e, 0x3a, 0x3f, 0x62, 0x52, 0x3e, 0x38, 0x3a, - 0x22, 0x92, 0x33, 0xcb, 0xe3, 0xc9, 0x84, 0x7e, 0xb2, 0x1d, 0xa8, 0xa7, 0xde, 0xd3, 0xbc, 0xad, - 0x82, 0x6f, 0xbd, 0xc9, 0x66, 0xca, 0xe6, 0xac, 0x0d, 0x74, 0xd8, 0xc6, 0x0f, 0x81, 0xfd, 0x19, - 0x6f, 0x4b, 0xf6, 0xa1, 0x1c, 0xf5, 0x4f, 0xbf, 0x6c, 0x88, 0xe1, 0xf4, 0x95, 0xc4, 0x65, 0xc3, - 0xd6, 0x70, 0xe8, 0x0b, 0xbe, 0x48, 0x07, 0x66, 0xc4, 0xf2, 0x41, 0x3b, 0x31, 0x5b, 0xc4, 0xf7, - 0x8d, 0xff, 0x96, 0x81, 0x02, 0xdd, 0x7c, 0x7c, 0x0b, 0x16, 0x09, 0x3f, 0x0a, 0x08, 0x94, 0xae, - 0x72, 0x3a, 0x77, 0xfb, 0x32, 0x16, 0x50, 0x6c, 0x0b, 0xed, 0x36, 0x78, 0x36, 0x5a, 0x79, 0xed, - 0x46, 0xf8, 0x1d, 0x28, 0x47, 0x4d, 0x6b, 0xa4, 0x53, 0x52, 0x2d, 0xb3, 0x57, 0x21, 0x7f, 0xee, - 0x4d, 0x94, 0xe5, 0x07, 0xe2, 0x99, 0x34, 0x11, 0x1e, 0xf7, 0x45, 0xb4, 0x41, 0x9d, 0x97, 0x16, - 0x8b, 0xa8, 0x11, 0x24, 0x83, 0xf9, 0x31, 0x2e, 0xa4, 0x8c, 0xf1, 0x18, 0x16, 0x05, 0x1f, 0xd0, - 0x62, 0x5a, 0xae, 0x3f, 0x34, 0xdf, 0x11, 0x12, 0xde, 0x60, 0x34, 0x1d, 0x72, 0xdd, 0xf6, 0x86, - 0x01, 0x70, 0x12, 0xae, 0x24, 0x6b, 0xe3, 0x77, 0x32, 0xc4, 0x5f, 0x44, 0xbd, 0xec, 0x1e, 0xe4, - 0xc5, 0xf9, 0x36, 0x63, 0x89, 0x8f, 0xee, 0x35, 0x08, 0x3c, 0x13, 0x31, 0xc4, 0xd2, 0xa1, 0xd7, - 0x5e, 0xaf, 0xbd, 0x66, 0x56, 0xdc, 0xe9, 0x38, 0x32, 0x5d, 0xbd, 0xa9, 0x86, 0x35, 0x63, 0xf6, - 0xa1, 0xd1, 0x47, 0xdb, 0x74, 0x53, 0x8b, 0xa4, 0xcb, 0x27, 0x4e, 0x4c, 0x25, 0x05, 0x0e, 0xcf, - 0xb8, 0x16, 0x41, 0xf7, 0x7b, 0x59, 0xa8, 0x25, 0x7a, 0x84, 0xa1, 0x84, 0xe2, 0x00, 0x20, 0xc7, - 0x92, 0x5c, 0x6f, 0x10, 0x20, 0x29, 0xa8, 0x6b, 0xf3, 0x94, 0x4d, 0xcc, 0x53, 0x14, 0x9c, 0x93, - 0xd3, 0x83, 0x73, 0x1e, 0x42, 0x39, 0x7e, 0x05, 0x20, 0xd9, 0x25, 0xd1, 0x9e, 0xba, 0xdd, 0x11, - 0x23, 0xc5, 0xe1, 0x3c, 0x05, 0x3d, 0x9c, 0xe7, 0x07, 0x5a, 0xf4, 0xc7, 0x02, 0x56, 0x63, 0xa4, - 0xcd, 0xe8, 0xcf, 0x24, 0xf6, 0xc3, 0xf8, 0x08, 0x2a, 0x5a, 0xe7, 0xf5, 0x28, 0x8f, 0x4c, 0x22, - 0xca, 0x23, 0xba, 0x9d, 0x95, 0x8d, 0x6f, 0x67, 0x19, 0x7f, 0x39, 0x0b, 0x35, 0xb1, 0xbf, 0x1c, - 0xf7, 0xec, 0xc8, 0x1b, 0x39, 0x03, 0x74, 0x34, 0x45, 0x3b, 0x4c, 0x0a, 0x5a, 0x6a, 0x9f, 0xc9, - 0x2d, 0x46, 0x72, 0x96, 0x7e, 0x35, 0x95, 0x98, 0x74, 0x74, 0x35, 0xd5, 0x80, 0x9a, 0x60, 0x8c, - 0xe8, 0x32, 0x8a, 0xdf, 0x12, 0x30, 0x2b, 0xa7, 0x9c, 0x6f, 0xd9, 0x01, 0x71, 0xc8, 0x6f, 0xc1, - 0xb2, 0xc0, 0xc1, 0x5b, 0x79, 0x63, 0x67, 0x34, 0x72, 0x08, 0x93, 0x0c, 0x4d, 0x8d, 0x53, 0xce, - 0x4d, 0x3b, 0xe4, 0x07, 0x22, 0x43, 0x3e, 0x3d, 0x50, 0x1a, 0x3a, 0x81, 0x7d, 0x12, 0x07, 0x7c, - 0x46, 0x69, 0xf4, 0x2c, 0xdb, 0x97, 0x9a, 0x67, 0x99, 0x0c, 0x10, 0x95, 0xb1, 0x7d, 0x19, 0x79, - 0x96, 0x67, 0x28, 0xa9, 0x38, 0x4b, 0x49, 0xc6, 0xbf, 0xcd, 0x42, 0x45, 0x23, 0xcb, 0x97, 0x39, - 0x5d, 0x6f, 0xcf, 0x39, 0x06, 0xcb, 0xba, 0x0f, 0xf0, 0xf5, 0x64, 0x93, 0x18, 0xfb, 0x42, 0x8f, - 0x1c, 0x68, 0x04, 0x7c, 0x0b, 0xca, 0x62, 0xd7, 0xbd, 0x8f, 0x26, 0x58, 0xf9, 0xf4, 0x07, 0x02, - 0x8e, 0xa6, 0x27, 0x2a, 0xf3, 0x11, 0x66, 0x16, 0xe2, 0xcc, 0x47, 0x22, 0xf3, 0x79, 0x21, 0xd8, - 0x1f, 0x42, 0x55, 0xd6, 0x8a, 0x6b, 0x8a, 0xc3, 0x8d, 0x77, 0x7d, 0x62, 0xbd, 0xcd, 0x0a, 0x35, - 0x47, 0x8b, 0x2f, 0x0b, 0x3e, 0x52, 0x05, 0x4b, 0x2f, 0x2a, 0xf8, 0x88, 0x12, 0xc6, 0x6e, 0x14, - 0xd5, 0x8e, 0x71, 0x57, 0x8a, 0x8f, 0x3d, 0x80, 0x65, 0xc5, 0xae, 0xa6, 0xae, 0xed, 0xba, 0xde, - 0xd4, 0x1d, 0x70, 0x75, 0x41, 0x8b, 0xc9, 0xac, 0xe3, 0x38, 0xc7, 0x18, 0x46, 0xb7, 0x7d, 0x29, - 0x7e, 0xeb, 0x3e, 0x14, 0x48, 0x2e, 0x27, 0xe1, 0x23, 0x9d, 0x71, 0x11, 0x0a, 0xbb, 0x07, 0x05, - 0x12, 0xcf, 0xb3, 0xd7, 0x32, 0x1b, 0x42, 0x30, 0x5a, 0xc0, 0x44, 0xc1, 0x03, 0x1e, 0xfa, 0xce, - 0x20, 0x88, 0xef, 0x7e, 0x15, 0x84, 0xfe, 0x49, 0x6d, 0xc5, 0x96, 0xdb, 0x18, 0x13, 0x75, 0x54, - 0xc2, 0x11, 0x07, 0xd3, 0x72, 0xa2, 0x0e, 0x29, 0x2e, 0x8d, 0x60, 0xed, 0x84, 0x87, 0xcf, 0x38, - 0x77, 0x5d, 0x21, 0x0c, 0x0d, 0xb8, 0x1b, 0xfa, 0xf6, 0x48, 0x2c, 0x12, 0x8d, 0xe0, 0xf1, 0x5c, - 0xad, 0xb1, 0x0d, 0x64, 0x2b, 0x2e, 0xb8, 0x1d, 0x95, 0x23, 0xde, 0xb1, 0x7a, 0x92, 0x96, 0xb7, - 0xf1, 0x4b, 0xb0, 0x71, 0x7d, 0xa1, 0x94, 0x7b, 0x9f, 0xf7, 0x92, 0x5c, 0x25, 0xf2, 0x03, 0x8e, - 0x3c, 0x3b, 0xa4, 0xde, 0xe8, 0x9c, 0xa5, 0x0b, 0x15, 0x2d, 0x27, 0x3e, 0xfb, 0x33, 0x28, 0xdc, - 0x51, 0x42, 0x9c, 0x48, 0xae, 0xe7, 0x8f, 0xd1, 0xef, 0x36, 0xb4, 0xe2, 0xda, 0x33, 0xe6, 0x62, - 0x0c, 0xc7, 0xeb, 0xef, 0xc6, 0x26, 0x2c, 0xa2, 0x64, 0xaf, 0x1d, 0x74, 0xcf, 0x13, 0x06, 0x8d, - 0x15, 0x60, 0x5d, 0xe2, 0x5d, 0x7a, 0xbc, 0xe7, 0x7f, 0xce, 0x41, 0x45, 0x03, 0x8b, 0xd3, 0x08, - 0x03, 0x00, 0xad, 0xa1, 0x63, 0x8f, 0xb9, 0x72, 0x72, 0xd6, 0xcc, 0x1a, 0x42, 0x77, 0x24, 0x50, - 0x9c, 0xc5, 0xf6, 0xc5, 0x99, 0xe5, 0x4d, 0x43, 0x6b, 0xc8, 0xcf, 0x7c, 0xae, 0x7a, 0x59, 0xb5, - 0x2f, 0xce, 0x0e, 0xa7, 0xe1, 0x0e, 0xc2, 0x04, 0x96, 0xe0, 0x25, 0x1a, 0x96, 0x8c, 0x59, 0x1b, - 0xdb, 0x97, 0x31, 0x96, 0x0c, 0x9c, 0x24, 0xca, 0xcc, 0x47, 0x81, 0x93, 0xa4, 0x2d, 0xce, 0x1e, - 0xa0, 0x85, 0xf9, 0x03, 0xf4, 0x3b, 0xb0, 0x46, 0x07, 0xa8, 0x64, 0xcd, 0xd6, 0xcc, 0x4e, 0x5e, - 0xc1, 0x5c, 0x39, 0x48, 0x4d, 0xec, 0x6d, 0x88, 0x11, 0x28, 0xb6, 0x14, 0x38, 0x3f, 0x21, 0x46, - 0x96, 0x31, 0xc5, 0xc8, 0x64, 0xe5, 0x3d, 0xe7, 0x27, 0x5c, 0x60, 0x62, 0x74, 0x8c, 0x8e, 0x29, - 0x2f, 0x58, 0x8c, 0x1d, 0x77, 0x16, 0xd3, 0xbe, 0x4c, 0x62, 0x96, 0x25, 0xa6, 0x7d, 0xa9, 0x63, - 0x3e, 0x86, 0xf5, 0x31, 0x1f, 0x3a, 0x76, 0xb2, 0x5a, 0x2b, 0x16, 0xdc, 0x56, 0x28, 0x5b, 0x2b, - 0xd3, 0x23, 0xc5, 0x5d, 0xcc, 0xc6, 0x4f, 0xbc, 0xf1, 0x89, 0x43, 0x32, 0x0b, 0xc5, 0xeb, 0xe4, - 0xcd, 0xba, 0x3b, 0x1d, 0xff, 0x18, 0xc1, 0xa2, 0x48, 0x60, 0xd4, 0xa0, 0xd2, 0x0b, 0xbd, 0x89, - 0x5a, 0xe6, 0x3a, 0x54, 0x29, 0x29, 0x6f, 0x3d, 0xde, 0x82, 0x9b, 0xc8, 0x12, 0xfa, 0xde, 0xc4, - 0x1b, 0x79, 0x67, 0x57, 0x09, 0x3b, 0xde, 0x7f, 0xc8, 0xc0, 0x72, 0x22, 0x57, 0xb2, 0xd7, 0xef, - 0x10, 0x3f, 0x8b, 0xae, 0xae, 0xd1, 0x1e, 0x5c, 0xd2, 0xf6, 0x20, 0x21, 0x12, 0x33, 0x53, 0xd7, - 0xd9, 0x5a, 0xf1, 0xf3, 0x0c, 0xaa, 0x20, 0xb1, 0x94, 0xe6, 0x3c, 0x4b, 0x91, 0xe5, 0xd5, 0xc3, - 0x0d, 0xaa, 0x8a, 0x9f, 0x93, 0x97, 0x60, 0x86, 0x72, 0xc8, 0xb9, 0xe4, 0x4d, 0x02, 0xdd, 0xe6, - 0xa7, 0x7a, 0x10, 0x1b, 0x02, 0x03, 0xe3, 0x1f, 0x67, 0x00, 0xe2, 0xde, 0xe1, 0x5d, 0x86, 0x48, - 0x6e, 0xc9, 0x60, 0x18, 0xaa, 0x26, 0xa3, 0xbc, 0x06, 0xd5, 0x28, 0x62, 0x39, 0x96, 0x84, 0x2a, - 0x0a, 0x26, 0xc4, 0xa1, 0xb7, 0x61, 0xf1, 0x6c, 0xe4, 0x9d, 0xa0, 0xc4, 0x2a, 0xe5, 0x16, 0x8a, - 0x57, 0xab, 0x13, 0x58, 0x49, 0x23, 0xb1, 0xdc, 0x94, 0x4f, 0x0d, 0x6a, 0xd6, 0xa5, 0x20, 0xe3, - 0x6f, 0x66, 0xa3, 0xd0, 0xcd, 0x78, 0x26, 0x9e, 0xaf, 0xde, 0xfd, 0x34, 0xb1, 0x34, 0xcf, 0x73, - 0x2f, 0x7e, 0x04, 0x75, 0x9f, 0x0e, 0x25, 0x75, 0x62, 0xe5, 0x9f, 0x73, 0x62, 0xd5, 0xfc, 0x84, - 0xa4, 0xf3, 0x0e, 0x34, 0xec, 0xe1, 0x05, 0xf7, 0x43, 0x07, 0xad, 0xf5, 0x28, 0x1f, 0xcb, 0x60, - 0x49, 0x0d, 0x8e, 0x82, 0xe8, 0xdb, 0xb0, 0x28, 0x6f, 0xe2, 0x46, 0x98, 0xf2, 0x1d, 0xa0, 0x18, - 0x2c, 0x10, 0x8d, 0x7f, 0xa6, 0x62, 0x45, 0x93, 0xab, 0xfb, 0xfc, 0x59, 0xd1, 0x47, 0x98, 0x9d, - 0x77, 0xa0, 0x4a, 0x42, 0x92, 0x4e, 0x00, 0xc9, 0x8f, 0x08, 0x28, 0x5d, 0x00, 0xc9, 0x69, 0xcd, - 0xbf, 0xcc, 0xb4, 0x1a, 0xff, 0x31, 0x03, 0xc5, 0x3d, 0x6f, 0xb2, 0xe7, 0x50, 0x34, 0x3f, 0x6e, - 0x93, 0xc8, 0x47, 0xb5, 0x20, 0x92, 0x18, 0xf8, 0xf3, 0x9c, 0x0b, 0x67, 0xa9, 0x62, 0x5e, 0x2d, - 0x29, 0xe6, 0xfd, 0x00, 0x6e, 0xa1, 0x0b, 0xd0, 0xf7, 0x26, 0x9e, 0x2f, 0xb6, 0xaa, 0x3d, 0x22, - 0x71, 0xcf, 0x73, 0xc3, 0x73, 0xc5, 0x3b, 0x6f, 0x9e, 0x72, 0x7e, 0xa4, 0x61, 0x1c, 0x44, 0x08, - 0x78, 0xa5, 0x73, 0x14, 0x5e, 0x58, 0xa4, 0xa1, 0x4b, 0x79, 0x94, 0x38, 0xea, 0xa2, 0xc8, 0x68, - 0x23, 0x1c, 0x25, 0x52, 0xe3, 0xbb, 0x50, 0x8e, 0x8c, 0x3d, 0xec, 0x5d, 0x28, 0x9f, 0x7b, 0x13, - 0x69, 0x11, 0xca, 0x24, 0x2e, 0xe5, 0xc9, 0x51, 0x9b, 0xa5, 0x73, 0xfa, 0x11, 0x18, 0x7f, 0x54, - 0x84, 0x62, 0xc7, 0xbd, 0xf0, 0x9c, 0x01, 0x46, 0x9b, 0x8e, 0xf9, 0xd8, 0x53, 0xcf, 0x01, 0x88, - 0xdf, 0x18, 0x9b, 0x15, 0xbf, 0xe6, 0x93, 0x93, 0xb1, 0x59, 0xd1, 0x3b, 0x3e, 0xab, 0xb0, 0xe0, - 0xeb, 0xcf, 0xf1, 0x14, 0x7c, 0x8c, 0x7f, 0x8f, 0xce, 0xcb, 0x82, 0xf6, 0xc8, 0x82, 0xa8, 0x8b, - 0x9e, 0x89, 0xc1, 0x29, 0xa3, 0xeb, 0x99, 0x65, 0x84, 0xe0, 0x84, 0xbd, 0x02, 0x45, 0x79, 0x07, - 0x8e, 0x2e, 0x2d, 0x51, 0xc0, 0xba, 0x04, 0x21, 0x35, 0xf8, 0x9c, 0x5c, 0xb8, 0x91, 0x20, 0x9b, - 0x33, 0xab, 0x0a, 0xb8, 0x23, 0x68, 0xed, 0x0e, 0x54, 0x08, 0x9f, 0x50, 0x4a, 0x32, 0x48, 0x13, - 0x41, 0x88, 0x90, 0xf2, 0xaa, 0x55, 0x39, 0xf5, 0x55, 0x2b, 0x0c, 0x27, 0x8e, 0xb8, 0x2c, 0x0d, - 0x11, 0xe8, 0x2d, 0x23, 0x0d, 0xae, 0x9e, 0x8a, 0x93, 0x36, 0x15, 0xba, 0xad, 0xac, 0x6c, 0x2a, - 0xaf, 0x43, 0xed, 0xd4, 0x1e, 0x8d, 0x4e, 0xec, 0xc1, 0x53, 0x32, 0x05, 0x54, 0xc9, 0xfa, 0xa9, - 0x80, 0x68, 0x0b, 0xb8, 0x03, 0x15, 0x6d, 0x95, 0x31, 0x02, 0x33, 0x6f, 0x42, 0xbc, 0xbe, 0xb3, - 0x16, 0xbe, 0xfa, 0x4b, 0x58, 0xf8, 0xb4, 0x48, 0xd4, 0xc5, 0x64, 0x24, 0xea, 0x2d, 0xe4, 0xa6, - 0x32, 0xe4, 0xb0, 0x41, 0x0f, 0xe7, 0xd8, 0xc3, 0x21, 0x86, 0x1c, 0xa2, 0x21, 0x8b, 0x26, 0x8f, - 0xf2, 0x97, 0x48, 0x97, 0x20, 0x18, 0xa1, 0xdc, 0x26, 0x33, 0xf5, 0xc4, 0x76, 0x86, 0x78, 0xe9, - 0x80, 0xac, 0x07, 0x45, 0x7b, 0x1c, 0x1e, 0xd9, 0xce, 0x90, 0xdd, 0x85, 0xaa, 0xca, 0xc6, 0xd3, - 0x71, 0x99, 0xe6, 0x5f, 0x66, 0x8b, 0x33, 0xd1, 0x80, 0x5a, 0x84, 0x31, 0x8e, 0xaf, 0x1c, 0x57, - 0x24, 0x0a, 0xd2, 0xc1, 0xfb, 0x18, 0xe5, 0x13, 0x72, 0xbc, 0x58, 0x5c, 0x7f, 0x74, 0x2b, 0x0a, - 0x3e, 0x40, 0x2a, 0x55, 0xff, 0xc9, 0x39, 0x46, 0x98, 0x42, 0xb8, 0x23, 0x1f, 0xdd, 0x5a, 0x42, - 0xfe, 0x95, 0xa8, 0xe8, 0xa3, 0x23, 0x04, 0xf6, 0x5d, 0x4d, 0x7f, 0x6d, 0x22, 0xf2, 0x2b, 0x33, - 0xf5, 0x5f, 0x77, 0x29, 0xeb, 0x36, 0x80, 0x13, 0x88, 0x53, 0x26, 0xe0, 0xee, 0x10, 0xef, 0x08, - 0x97, 0xcc, 0xb2, 0x13, 0x3c, 0x21, 0xc0, 0x37, 0xab, 0xd8, 0xb6, 0xa0, 0xaa, 0x0f, 0x93, 0x95, - 0x20, 0x7f, 0x78, 0xd4, 0xee, 0x36, 0x6e, 0xb0, 0x0a, 0x14, 0x7b, 0xed, 0x7e, 0x7f, 0x1f, 0x3d, - 0x7d, 0x55, 0x28, 0x45, 0x17, 0x19, 0xb3, 0x22, 0xd5, 0xda, 0xde, 0x6e, 0x1f, 0xf5, 0xdb, 0x3b, - 0x8d, 0xdc, 0x8f, 0xf2, 0xa5, 0x6c, 0x23, 0x67, 0xfc, 0x71, 0x0e, 0x2a, 0xda, 0x2c, 0x3c, 0x9f, - 0x19, 0xdf, 0x06, 0x40, 0x4d, 0x32, 0x8e, 0x48, 0xcd, 0x9b, 0x65, 0x01, 0xa1, 0xc5, 0xd7, 0x7d, - 0x14, 0x39, 0x7a, 0x91, 0x49, 0xf9, 0x28, 0x5e, 0x87, 0x1a, 0x3d, 0x6e, 0xa4, 0xfb, 0x6b, 0x0b, - 0x66, 0x95, 0x80, 0x92, 0x55, 0xe3, 0x0d, 0x67, 0x44, 0xc2, 0xeb, 0x75, 0xf2, 0x51, 0x13, 0x02, - 0xe1, 0x05, 0x3b, 0xbc, 0x1d, 0x19, 0x78, 0xa3, 0x0b, 0x4e, 0x18, 0x24, 0x11, 0x56, 0x24, 0xac, - 0x2f, 0xef, 0x6a, 0x4b, 0x7e, 0xa8, 0x5d, 0xb1, 0x2d, 0x98, 0x55, 0x02, 0xca, 0x86, 0xbe, 0xa5, - 0x08, 0x88, 0xa2, 0x57, 0xd6, 0xe7, 0xa9, 0x21, 0x41, 0x3c, 0xfb, 0x73, 0x66, 0xc4, 0x32, 0x12, - 0xc6, 0x9b, 0xf3, 0xe5, 0x5e, 0x6c, 0x4e, 0x64, 0xef, 0x02, 0x1b, 0x4f, 0x26, 0x56, 0x8a, 0x81, - 0x2f, 0x6f, 0x2e, 0x8e, 0x27, 0x93, 0xbe, 0x66, 0xff, 0xfa, 0x06, 0x6c, 0x8f, 0x5f, 0x00, 0x6b, - 0x89, 0x0d, 0x8c, 0x5d, 0x8c, 0x54, 0xb1, 0x98, 0x2d, 0x67, 0x74, 0xb6, 0x9c, 0xc2, 0xfd, 0xb2, - 0xa9, 0xdc, 0xef, 0x79, 0x7c, 0xc2, 0xd8, 0x85, 0xca, 0x91, 0xf6, 0x74, 0xda, 0x5d, 0x71, 0x42, - 0xa8, 0x47, 0xd3, 0xe8, 0xec, 0x20, 0x9b, 0xa2, 0x2f, 0xdf, 0x4a, 0xd3, 0x7a, 0x93, 0xd5, 0x7a, - 0x63, 0xfc, 0xc3, 0x0c, 0x3d, 0x35, 0x13, 0x75, 0x3e, 0x7e, 0xad, 0x4d, 0xb9, 0xdf, 0xe2, 0x9b, - 0xf0, 0x15, 0xe5, 0x76, 0x93, 0x97, 0xd8, 0xb1, 0x6b, 0x96, 0x77, 0x7a, 0x1a, 0x70, 0x15, 0xe3, - 0x51, 0x41, 0xd8, 0x21, 0x82, 0x94, 0xf0, 0x2d, 0x24, 0x7c, 0x87, 0xea, 0x0f, 0x64, 0x60, 0x87, - 0x10, 0xbe, 0x0f, 0xec, 0x4b, 0xd9, 0x6a, 0x20, 0x44, 0x10, 0xe9, 0x1f, 0x50, 0x97, 0x65, 0xa3, - 0xb4, 0xf1, 0xf7, 0xe4, 0x65, 0xfd, 0xd9, 0xf9, 0xbd, 0x0f, 0xa5, 0xa8, 0xd6, 0xe4, 0x09, 0xab, - 0x30, 0xa3, 0x7c, 0x71, 0x8e, 0xa3, 0x31, 0x24, 0xd1, 0x63, 0xda, 0x5c, 0xe8, 0xe3, 0xe9, 0x68, - 0xbd, 0x7e, 0x0f, 0xd8, 0xa9, 0xe3, 0xcf, 0x22, 0xd3, 0x66, 0x6b, 0x60, 0x8e, 0x86, 0x6d, 0x1c, - 0xc3, 0xb2, 0xe2, 0x12, 0x9a, 0x46, 0x90, 0x5c, 0xbc, 0xcc, 0x0b, 0x98, 0x7c, 0x76, 0x8e, 0xc9, - 0x1b, 0xbf, 0x5e, 0x80, 0xa2, 0x7a, 0x86, 0x30, 0xed, 0xe9, 0xbc, 0x72, 0xf2, 0xe9, 0xbc, 0x66, - 0xe2, 0x41, 0x25, 0x5c, 0x7a, 0x79, 0xde, 0xbf, 0x3d, 0x7b, 0x64, 0x6b, 0xbe, 0x8a, 0xc4, 0xb1, - 0x2d, 0x7d, 0x15, 0x85, 0xa4, 0xaf, 0x22, 0xed, 0x39, 0x41, 0x12, 0x3d, 0xe7, 0x9e, 0x13, 0xbc, - 0x05, 0x24, 0x47, 0x68, 0xc1, 0x6d, 0x25, 0x04, 0x88, 0x33, 0x27, 0x29, 0x76, 0x94, 0x66, 0xc5, - 0x8e, 0x97, 0x16, 0x09, 0xbe, 0x03, 0x0b, 0xf4, 0xbc, 0x86, 0xbc, 0xfc, 0xab, 0x0e, 0x0e, 0x39, - 0x57, 0xea, 0x3f, 0xdd, 0x78, 0x30, 0x25, 0xae, 0xfe, 0x36, 0x57, 0x25, 0xf1, 0x36, 0x97, 0xee, - 0x43, 0xa9, 0x26, 0x7d, 0x28, 0xf7, 0xa0, 0x11, 0x4d, 0x1c, 0x5a, 0x24, 0xdd, 0x40, 0xde, 0x1c, - 0xac, 0x2b, 0xb8, 0xe0, 0x86, 0xdd, 0x20, 0x3e, 0xf8, 0xea, 0x89, 0x83, 0x4f, 0xf0, 0xaa, 0x56, - 0x18, 0xf2, 0xf1, 0x24, 0x54, 0x07, 0x9f, 0xf6, 0x82, 0x23, 0xad, 0xfc, 0x22, 0xae, 0xbc, 0x5a, - 0x5e, 0xa2, 0x8e, 0x2d, 0xa8, 0x9f, 0xda, 0xce, 0x68, 0xea, 0x73, 0xcb, 0xe7, 0x76, 0xe0, 0xb9, - 0xb8, 0xf9, 0xe3, 0x33, 0x58, 0x0e, 0x71, 0x97, 0x70, 0x4c, 0x44, 0x31, 0x6b, 0xa7, 0x7a, 0x12, - 0x2f, 0x31, 0xe9, 0x33, 0x21, 0x8e, 0x2c, 0x79, 0x87, 0x98, 0x62, 0x55, 0x3a, 0x5d, 0x6b, 0x77, - 0xbf, 0xf3, 0xf1, 0x5e, 0xbf, 0x91, 0x11, 0xc9, 0xde, 0xf1, 0xf6, 0x76, 0xbb, 0xbd, 0x83, 0x47, - 0x18, 0xc0, 0xc2, 0x6e, 0xab, 0xb3, 0x2f, 0x0f, 0xb0, 0x7c, 0xa3, 0x60, 0xfc, 0xeb, 0x2c, 0x54, - 0xb4, 0xd1, 0xb0, 0xc7, 0xd1, 0x22, 0xd0, 0x0b, 0x50, 0xb7, 0xe7, 0x47, 0xbc, 0xa9, 0x38, 0xbc, - 0xb6, 0x0a, 0xd1, 0x5b, 0x8d, 0xd9, 0x6b, 0xdf, 0x6a, 0x64, 0x6f, 0xc1, 0xa2, 0x4d, 0x35, 0x44, - 0x93, 0x2e, 0x8d, 0xfb, 0x12, 0x2c, 0xe7, 0x1c, 0x23, 0x48, 0xe3, 0x63, 0x4a, 0xe0, 0xe5, 0x55, - 0xd0, 0x66, 0x74, 0x52, 0xe1, 0xda, 0x14, 0xe5, 0xcc, 0x48, 0x67, 0x7c, 0x74, 0xe0, 0xcb, 0xf9, - 0x52, 0xd9, 0x82, 0x05, 0x25, 0x28, 0xbc, 0x6a, 0x46, 0x69, 0xe3, 0x03, 0x80, 0x78, 0x3c, 0xc9, - 0xe9, 0xbb, 0x91, 0x9c, 0xbe, 0x8c, 0x36, 0x7d, 0x59, 0xe3, 0x9f, 0x4a, 0xd6, 0x25, 0xd7, 0x22, - 0x32, 0xf5, 0x7d, 0x0b, 0x94, 0xf1, 0xd1, 0xc2, 0x20, 0xef, 0xc9, 0x88, 0x87, 0xea, 0x31, 0x83, - 0x25, 0x99, 0xd3, 0x89, 0x32, 0xe6, 0x58, 0x6d, 0x76, 0x9e, 0xd5, 0xbe, 0x06, 0x55, 0xc1, 0x66, - 0x25, 0x21, 0x05, 0x92, 0x5d, 0x55, 0xc6, 0xf6, 0xa5, 0x6a, 0x3b, 0xc1, 0x63, 0xf3, 0x33, 0x3c, - 0xf6, 0xef, 0x67, 0xe8, 0x6d, 0x91, 0xb8, 0xa3, 0x31, 0x93, 0x8d, 0xea, 0x4c, 0x32, 0x59, 0x89, - 0x6a, 0x46, 0xf9, 0xd7, 0x30, 0xce, 0x6c, 0x3a, 0xe3, 0x4c, 0x67, 0xc9, 0xb9, 0x54, 0x96, 0x6c, - 0x6c, 0x40, 0x73, 0x87, 0x8b, 0xa9, 0x68, 0x8d, 0x46, 0x33, 0x73, 0x69, 0xdc, 0x82, 0x9b, 0x29, - 0x79, 0xd2, 0x6a, 0xf3, 0x09, 0xac, 0xb6, 0xe8, 0xd1, 0x85, 0x6f, 0xea, 0xf2, 0xa4, 0xd1, 0x84, - 0xb5, 0xd9, 0x2a, 0x65, 0x63, 0xbb, 0xb0, 0xb4, 0xc3, 0x4f, 0xa6, 0x67, 0xfb, 0xfc, 0x22, 0x6e, - 0x88, 0x41, 0x3e, 0x38, 0xf7, 0x9e, 0xc9, 0xc5, 0xc5, 0xdf, 0x18, 0x96, 0x29, 0x70, 0xac, 0x60, - 0xc2, 0x07, 0xca, 0x72, 0x8f, 0x90, 0xde, 0x84, 0x0f, 0x8c, 0xc7, 0xc0, 0xf4, 0x7a, 0xe4, 0x4a, - 0x08, 0xb5, 0x6a, 0x7a, 0x62, 0x05, 0x57, 0x41, 0xc8, 0xc7, 0xea, 0xd2, 0x20, 0x04, 0xd3, 0x93, - 0x1e, 0x41, 0x8c, 0xb7, 0xa1, 0x7a, 0x64, 0x5f, 0x99, 0xfc, 0x0b, 0x79, 0x37, 0x6f, 0x1d, 0x8a, - 0x13, 0xfb, 0x4a, 0xf0, 0xd3, 0xc8, 0x89, 0x87, 0xd9, 0xc6, 0xbf, 0xc8, 0xc3, 0x02, 0x61, 0xb2, - 0xbb, 0xf4, 0x12, 0xb2, 0xe3, 0x22, 0x3f, 0x53, 0x27, 0x8b, 0x06, 0x9a, 0x3b, 0x7c, 0xb2, 0xf3, - 0x87, 0x8f, 0xb4, 0x38, 0xaa, 0x57, 0x9d, 0x94, 0xbb, 0xc5, 0x9d, 0x8e, 0xd5, 0x53, 0x4e, 0xc9, - 0x97, 0x07, 0xf2, 0xf1, 0x0b, 0xda, 0x74, 0xeb, 0x3a, 0xe9, 0x10, 0x8f, 0x95, 0x37, 0xea, 0x9d, - 0x3a, 0x53, 0xe5, 0xb9, 0xa3, 0x83, 0x52, 0x35, 0xc4, 0xa2, 0xba, 0x70, 0x9a, 0xd4, 0x10, 0xe7, - 0x34, 0xc1, 0xd2, 0x8b, 0x35, 0x41, 0x32, 0x45, 0x3e, 0x47, 0x13, 0x84, 0x97, 0xd0, 0x04, 0x5f, - 0xc2, 0x19, 0x7d, 0x13, 0x4a, 0x28, 0x28, 0x69, 0xc7, 0x90, 0x10, 0x90, 0xc4, 0x31, 0xf4, 0xa1, - 0xa6, 0x2b, 0x51, 0x24, 0x8c, 0x76, 0x0e, 0x98, 0xfc, 0x8b, 0x9f, 0x8d, 0x93, 0xef, 0x73, 0x28, - 0x4a, 0xa8, 0x20, 0x68, 0xd7, 0x1e, 0xab, 0x87, 0xf1, 0xf0, 0xb7, 0x98, 0x36, 0x7c, 0xcd, 0xeb, - 0x8b, 0xa9, 0xe3, 0xf3, 0xa1, 0x7a, 0xf1, 0xc8, 0xc1, 0x3d, 0x2a, 0x20, 0x62, 0x80, 0x42, 0x6f, - 0x73, 0xbd, 0x67, 0xae, 0xe4, 0x3d, 0x45, 0x27, 0x78, 0x22, 0x92, 0x06, 0x83, 0x06, 0x3e, 0xa3, - 0x39, 0xf1, 0x7c, 0x75, 0xca, 0x1b, 0xbf, 0x9b, 0x81, 0x86, 0xdc, 0x5d, 0x51, 0x9e, 0xae, 0x36, - 0x15, 0xae, 0x0b, 0xdc, 0x78, 0xfe, 0xfb, 0x45, 0x06, 0xd4, 0xd0, 0x5a, 0x14, 0x1d, 0xf9, 0x64, - 0xed, 0xaa, 0x08, 0xe0, 0xae, 0x3c, 0xf6, 0x5f, 0x85, 0x8a, 0x0a, 0x1a, 0x1f, 0x3b, 0x23, 0xf5, - 0x58, 0x3e, 0x45, 0x8d, 0x1f, 0x38, 0x23, 0x25, 0x31, 0xf8, 0xb6, 0xbc, 0x00, 0x9d, 0x41, 0x89, - 0xc1, 0xb4, 0x43, 0x6e, 0xfc, 0xab, 0x0c, 0x2c, 0x69, 0x43, 0x91, 0xfb, 0xf6, 0xfb, 0x50, 0x8d, - 0xde, 0xaf, 0xe5, 0x91, 0xa8, 0xba, 0x9e, 0x64, 0x34, 0x71, 0xb1, 0xca, 0x20, 0x82, 0x04, 0xa2, - 0x33, 0x43, 0xfb, 0x8a, 0x22, 0x9b, 0xa7, 0x63, 0xa5, 0x0d, 0x0e, 0xed, 0xab, 0x5d, 0xce, 0x7b, - 0xd3, 0xb1, 0xd0, 0xf5, 0x9f, 0x71, 0xfe, 0x34, 0x42, 0x20, 0xf6, 0x09, 0x02, 0x26, 0x31, 0x0c, - 0xa8, 0x8d, 0x3d, 0x37, 0x3c, 0x8f, 0x50, 0xa4, 0x98, 0x8e, 0x40, 0xc2, 0x31, 0xfe, 0x30, 0x0b, - 0xcb, 0x64, 0x93, 0x94, 0xb6, 0x60, 0xc9, 0xba, 0x9a, 0xb0, 0x40, 0xe6, 0x59, 0x62, 0x5e, 0x7b, - 0x37, 0x4c, 0x99, 0x66, 0xdf, 0x79, 0x49, 0x3b, 0xaa, 0xba, 0x63, 0x7d, 0xcd, 0xf4, 0xe7, 0xe6, - 0xa7, 0xff, 0xfa, 0xe9, 0x4d, 0xf3, 0x0c, 0x17, 0xd2, 0x3c, 0xc3, 0x2f, 0xe3, 0x8f, 0x9d, 0xbb, - 0x0d, 0x5c, 0x94, 0x38, 0xda, 0x6d, 0xe0, 0xc7, 0xb0, 0x9e, 0xc0, 0x41, 0x6e, 0xed, 0x9c, 0x3a, - 0x5c, 0xbd, 0x58, 0xb3, 0xa2, 0x61, 0xf7, 0x54, 0xde, 0x56, 0x11, 0x0a, 0xc1, 0xc0, 0x9b, 0x70, - 0x63, 0x0d, 0x56, 0x92, 0xb3, 0x2a, 0x8f, 0x89, 0xdf, 0xca, 0x40, 0x53, 0xc6, 0xf1, 0x38, 0xee, - 0xd9, 0x9e, 0x13, 0x84, 0x9e, 0x1f, 0xbd, 0xf3, 0x7a, 0x1b, 0x80, 0x1e, 0xee, 0x47, 0xe5, 0x5b, - 0xbe, 0xd1, 0x82, 0x10, 0x54, 0xbd, 0x6f, 0x42, 0x89, 0xbb, 0x43, 0xca, 0x24, 0x6a, 0x28, 0x72, - 0x77, 0xa8, 0x14, 0xf7, 0xb9, 0xa3, 0xb4, 0x96, 0x14, 0x12, 0xe4, 0x8b, 0x08, 0x62, 0x76, 0xf8, - 0x05, 0x1e, 0xe9, 0xf9, 0xe8, 0x45, 0x84, 0x03, 0xfb, 0x12, 0xa3, 0x62, 0x03, 0xe3, 0x6f, 0x67, - 0x61, 0x31, 0xee, 0x1f, 0xbd, 0xb7, 0xf2, 0xfc, 0x97, 0x63, 0xee, 0x4a, 0x72, 0x70, 0x84, 0xc2, - 0xa3, 0x59, 0x6a, 0x4b, 0xb4, 0x39, 0x3b, 0x2e, 0x33, 0xa0, 0xa2, 0x30, 0xbc, 0x69, 0xa8, 0x3d, - 0xa1, 0x58, 0x26, 0x94, 0xc3, 0x69, 0x28, 0x34, 0x54, 0xa1, 0xaa, 0x3b, 0xae, 0xd4, 0x11, 0x0b, - 0xf6, 0x38, 0xec, 0xe0, 0xd7, 0x21, 0x04, 0x58, 0x14, 0xa3, 0x85, 0x14, 0x58, 0x02, 0xbf, 0x41, - 0x0a, 0x0b, 0xad, 0x1c, 0x2a, 0x2b, 0xba, 0x34, 0x4f, 0x0f, 0x5a, 0x47, 0xd2, 0xfc, 0xab, 0x50, - 0xa1, 0xca, 0xe3, 0xcb, 0xdf, 0x79, 0xb3, 0x8c, 0x2d, 0x60, 0xbe, 0xb4, 0x9a, 0x79, 0xd3, 0x84, - 0xad, 0x00, 0xa8, 0x29, 0x0c, 0x93, 0xf9, 0x6b, 0x19, 0xb8, 0x99, 0xb2, 0x6c, 0x72, 0x97, 0x6f, - 0xc3, 0xd2, 0x69, 0x94, 0xa9, 0x66, 0x97, 0xb6, 0xfa, 0x9a, 0x62, 0xab, 0xc9, 0x39, 0x35, 0x1b, - 0xa7, 0x49, 0x40, 0xac, 0xa5, 0xd2, 0x0a, 0x26, 0x9e, 0x16, 0x40, 0x91, 0x88, 0x96, 0x91, 0x14, - 0xc4, 0x23, 0xd8, 0x68, 0x5f, 0x0a, 0x8e, 0x11, 0x85, 0xd6, 0x0e, 0x9e, 0x4e, 0x95, 0xf7, 0x6a, - 0xc6, 0x22, 0x9f, 0x79, 0x29, 0x8b, 0xfc, 0x90, 0xee, 0x22, 0x47, 0x75, 0xfd, 0x34, 0x95, 0xe0, - 0x01, 0x2a, 0xca, 0x9c, 0x60, 0x15, 0xea, 0x8d, 0x01, 0x01, 0xa2, 0x4a, 0x8d, 0x00, 0x16, 0x0f, - 0xa6, 0xa3, 0xd0, 0xd9, 0x8e, 0x40, 0xec, 0x3b, 0xb2, 0x0c, 0xb6, 0xa3, 0x66, 0x2d, 0xb5, 0x21, - 0x88, 0x1a, 0xc2, 0xc9, 0x1a, 0x8b, 0x8a, 0xac, 0xf9, 0xf6, 0x16, 0xc7, 0xc9, 0x16, 0x8c, 0x9b, - 0xb0, 0x1e, 0xa7, 0x68, 0xda, 0xd4, 0x51, 0xf3, 0x0f, 0x32, 0x14, 0x82, 0x4f, 0x79, 0x3d, 0xd7, - 0x9e, 0x04, 0xe7, 0x5e, 0xc8, 0xda, 0xb0, 0x1c, 0x38, 0xee, 0xd9, 0x88, 0xeb, 0xd5, 0x07, 0x72, - 0x12, 0x56, 0x93, 0x7d, 0xa3, 0xa2, 0x81, 0xb9, 0x44, 0x25, 0xe2, 0xda, 0x02, 0xb6, 0x75, 0x5d, - 0x27, 0x63, 0xb2, 0x98, 0x99, 0x8d, 0xf9, 0xce, 0x77, 0xa0, 0x9e, 0x6c, 0x88, 0x7d, 0x28, 0xaf, - 0xf0, 0xc7, 0xbd, 0xca, 0xcd, 0xdc, 0x6f, 0x8e, 0x09, 0xa2, 0x12, 0xcf, 0x7d, 0x60, 0xfc, 0x8d, - 0x0c, 0x34, 0x4d, 0x2e, 0x28, 0x57, 0xeb, 0xa5, 0xa2, 0x99, 0xef, 0xcf, 0xd5, 0x7a, 0xfd, 0x58, - 0xd5, 0xcb, 0x00, 0xaa, 0x47, 0xef, 0x5d, 0xbb, 0x18, 0x7b, 0x37, 0xe6, 0x46, 0xb4, 0x55, 0x82, - 0x05, 0x42, 0x31, 0xd6, 0x61, 0x55, 0xf6, 0x47, 0xf5, 0x25, 0x76, 0xb7, 0x26, 0x5a, 0x4c, 0xb8, - 0x5b, 0x37, 0xa0, 0x49, 0x77, 0x75, 0xf5, 0x41, 0xc8, 0x82, 0x3b, 0xc0, 0x0e, 0xec, 0x81, 0xed, - 0x7b, 0x9e, 0x7b, 0xc4, 0x7d, 0x19, 0xd0, 0x8c, 0x12, 0x26, 0x7a, 0x23, 0x95, 0x28, 0x4c, 0x29, - 0xf5, 0x70, 0xac, 0xe7, 0xaa, 0xf8, 0x2d, 0x4a, 0x19, 0x26, 0x2c, 0x6f, 0xd9, 0x4f, 0xb9, 0xaa, - 0x49, 0x4d, 0xd1, 0x47, 0x50, 0x99, 0x44, 0x95, 0xaa, 0x79, 0x57, 0x4f, 0x8c, 0xcc, 0x37, 0x6b, - 0xea, 0xd8, 0xc6, 0x23, 0x58, 0x49, 0xd6, 0x29, 0x59, 0xc7, 0x06, 0x94, 0xc6, 0x12, 0x26, 0x7b, - 0x17, 0xa5, 0x8d, 0xdf, 0x28, 0x41, 0x51, 0x6a, 0xaa, 0x6c, 0x13, 0xf2, 0x03, 0x15, 0x43, 0x17, - 0x3f, 0x6d, 0x25, 0x73, 0xd5, 0xff, 0x6d, 0x8c, 0xa4, 0x13, 0x78, 0xec, 0x23, 0xa8, 0x27, 0xdd, - 0xc8, 0x33, 0x2f, 0x01, 0x24, 0xfd, 0xbf, 0xb5, 0xc1, 0x8c, 0xc3, 0xb0, 0x1c, 0x1f, 0x8e, 0x24, - 0x33, 0x94, 0xce, 0xb5, 0xd3, 0xd3, 0x73, 0x85, 0xbc, 0x1d, 0x9c, 0xdb, 0xd6, 0xa3, 0xc7, 0x1f, - 0xc8, 0xa7, 0x00, 0x2a, 0x08, 0xec, 0x9d, 0xdb, 0x8f, 0x1e, 0x7f, 0x30, 0x2b, 0x49, 0xcb, 0x87, - 0x00, 0x34, 0x49, 0x7a, 0x05, 0x0a, 0xf4, 0x42, 0x2a, 0x05, 0x43, 0x51, 0x82, 0x3d, 0x84, 0x15, - 0x65, 0xfc, 0x90, 0x61, 0xeb, 0xc4, 0x05, 0x4b, 0x74, 0x53, 0x50, 0xe6, 0xf5, 0x30, 0x8b, 0xcc, - 0x25, 0x6b, 0xb0, 0x70, 0x1e, 0x3f, 0x77, 0x5b, 0x33, 0x65, 0xca, 0xf8, 0xc3, 0x02, 0x54, 0xb4, - 0x49, 0x61, 0x55, 0x28, 0x99, 0xed, 0x5e, 0xdb, 0xfc, 0xb4, 0xbd, 0xd3, 0xb8, 0xc1, 0xee, 0xc1, - 0x1b, 0x9d, 0xee, 0xf6, 0xa1, 0x69, 0xb6, 0xb7, 0xfb, 0xd6, 0xa1, 0x69, 0xa9, 0x07, 0xd6, 0x8e, - 0x5a, 0x9f, 0x1f, 0xb4, 0xbb, 0x7d, 0x6b, 0xa7, 0xdd, 0x6f, 0x75, 0xf6, 0x7b, 0x8d, 0x0c, 0x7b, - 0x05, 0x9a, 0x31, 0xa6, 0xca, 0x6e, 0x1d, 0x1c, 0x1e, 0x77, 0xfb, 0x8d, 0x2c, 0xbb, 0x03, 0xb7, - 0x76, 0x3b, 0xdd, 0xd6, 0xbe, 0x15, 0xe3, 0x6c, 0xef, 0xf7, 0x3f, 0xb5, 0xda, 0xbf, 0x70, 0xd4, - 0x31, 0x3f, 0x6f, 0xe4, 0xd2, 0x10, 0xf6, 0xfa, 0xfb, 0xdb, 0xaa, 0x86, 0x3c, 0xbb, 0x09, 0xab, - 0x84, 0x40, 0x45, 0xac, 0xfe, 0xe1, 0xa1, 0xd5, 0x3b, 0x3c, 0xec, 0x36, 0x0a, 0x6c, 0x09, 0x6a, - 0x9d, 0xee, 0xa7, 0xad, 0xfd, 0xce, 0x8e, 0x65, 0xb6, 0x5b, 0xfb, 0x07, 0x8d, 0x05, 0xb6, 0x0c, - 0x8b, 0xb3, 0x78, 0x45, 0x51, 0x85, 0xc2, 0x3b, 0xec, 0x76, 0x0e, 0xbb, 0xd6, 0xa7, 0x6d, 0xb3, - 0xd7, 0x39, 0xec, 0x36, 0x4a, 0x6c, 0x0d, 0x58, 0x32, 0x6b, 0xef, 0xa0, 0xb5, 0xdd, 0x28, 0xb3, - 0x55, 0x58, 0x4a, 0xc2, 0x9f, 0xb4, 0x3f, 0x6f, 0x00, 0x6b, 0xc2, 0x0a, 0x75, 0xcc, 0xda, 0x6a, - 0xef, 0x1f, 0x7e, 0x66, 0x1d, 0x74, 0xba, 0x9d, 0x83, 0xe3, 0x83, 0x46, 0x05, 0xdf, 0x6d, 0x6c, - 0xb7, 0xad, 0x4e, 0xb7, 0x77, 0xbc, 0xbb, 0xdb, 0xd9, 0xee, 0xb4, 0xbb, 0xfd, 0x46, 0x95, 0x5a, - 0x4e, 0x1b, 0x78, 0x4d, 0x14, 0x90, 0x77, 0x5b, 0xac, 0x9d, 0x4e, 0xaf, 0xb5, 0xb5, 0xdf, 0xde, - 0x69, 0xd4, 0xd9, 0x6d, 0xb8, 0xd9, 0x6f, 0x1f, 0x1c, 0x1d, 0x9a, 0x2d, 0xf3, 0x73, 0x75, 0xf7, - 0xc5, 0xda, 0x6d, 0x75, 0xf6, 0x8f, 0xcd, 0x76, 0x63, 0x91, 0xbd, 0x06, 0xb7, 0xcd, 0xf6, 0x27, - 0xc7, 0x1d, 0xb3, 0xbd, 0x63, 0x75, 0x0f, 0x77, 0xda, 0xd6, 0x6e, 0xbb, 0xd5, 0x3f, 0x36, 0xdb, - 0xd6, 0x41, 0xa7, 0xd7, 0xeb, 0x74, 0x3f, 0x6e, 0x34, 0xd8, 0x1b, 0x70, 0x37, 0x42, 0x89, 0x2a, - 0x98, 0xc1, 0x5a, 0x12, 0xe3, 0x53, 0x4b, 0xda, 0x6d, 0xff, 0x42, 0xdf, 0x3a, 0x6a, 0xb7, 0xcd, - 0x06, 0x63, 0x1b, 0xb0, 0x16, 0x37, 0x4f, 0x0d, 0xc8, 0xb6, 0x97, 0x45, 0xde, 0x51, 0xdb, 0x3c, - 0x68, 0x75, 0xc5, 0x02, 0x27, 0xf2, 0x56, 0x44, 0xb7, 0xe3, 0xbc, 0xd9, 0x6e, 0xaf, 0x32, 0x06, - 0x75, 0x6d, 0x55, 0x76, 0x5b, 0x66, 0x63, 0x8d, 0x2d, 0x42, 0xe5, 0xe0, 0xe8, 0xc8, 0xea, 0x77, - 0x0e, 0xda, 0x87, 0xc7, 0xfd, 0xc6, 0x3a, 0x5b, 0x85, 0x46, 0xa7, 0xdb, 0x6f, 0x9b, 0x62, 0xad, - 0x55, 0xd1, 0xff, 0x51, 0x64, 0x2b, 0xb0, 0xa8, 0x7a, 0xaa, 0xa0, 0x7f, 0x52, 0x64, 0xeb, 0xc0, - 0x8e, 0xbb, 0x66, 0xbb, 0xb5, 0x23, 0x26, 0x2e, 0xca, 0xf8, 0x9f, 0x45, 0xe9, 0x52, 0xfa, 0xdd, - 0x5c, 0x74, 0x58, 0xc7, 0x31, 0x1a, 0xc9, 0xc7, 0xcf, 0xab, 0xda, 0xa3, 0xe5, 0x2f, 0xfa, 0x84, - 0x89, 0xa6, 0x5a, 0xe5, 0xe6, 0x54, 0xab, 0x39, 0xdd, 0xbd, 0xa6, 0xcb, 0x7e, 0xaf, 0x43, 0x6d, - 0x4c, 0x0f, 0xa1, 0xcb, 0x07, 0x8f, 0x41, 0x06, 0x2c, 0x11, 0x90, 0x5e, 0x3b, 0x9e, 0xfb, 0x86, - 0x47, 0x61, 0xfe, 0x1b, 0x1e, 0x69, 0xf2, 0xfd, 0x42, 0x9a, 0x7c, 0x7f, 0x1f, 0x96, 0x88, 0x35, - 0x39, 0xae, 0x33, 0x56, 0x5a, 0x33, 0x49, 0x81, 0x8b, 0xc8, 0xa2, 0x08, 0xae, 0xd4, 0x09, 0xa5, - 0x72, 0x48, 0x16, 0x52, 0x94, 0xda, 0x46, 0x42, 0xd3, 0x20, 0xce, 0x11, 0x69, 0x1a, 0x51, 0x0b, - 0xf6, 0x65, 0xdc, 0x42, 0x45, 0x6b, 0x81, 0xe0, 0xd8, 0xc2, 0x7d, 0x58, 0xe2, 0x97, 0xa1, 0x6f, - 0x5b, 0xde, 0xc4, 0xfe, 0x62, 0x8a, 0x3e, 0x6f, 0x1b, 0x75, 0xf8, 0xaa, 0xb9, 0x88, 0x19, 0x87, - 0x08, 0xdf, 0xb1, 0x43, 0xfb, 0xfe, 0x57, 0x50, 0xd1, 0x1e, 0xc9, 0x67, 0xeb, 0xb0, 0xfc, 0x59, - 0xa7, 0xdf, 0x6d, 0xf7, 0x7a, 0xd6, 0xd1, 0xf1, 0xd6, 0x93, 0xf6, 0xe7, 0xd6, 0x5e, 0xab, 0xb7, - 0xd7, 0xb8, 0x21, 0x36, 0x6d, 0xb7, 0xdd, 0xeb, 0xb7, 0x77, 0x12, 0xf0, 0x0c, 0x7b, 0x15, 0x36, - 0x8e, 0xbb, 0xc7, 0xbd, 0xf6, 0x8e, 0x95, 0x56, 0x2e, 0x2b, 0xa8, 0x54, 0xe6, 0xa7, 0x14, 0xcf, - 0xdd, 0xff, 0x15, 0xa8, 0x27, 0xaf, 0x81, 0x33, 0x80, 0x85, 0xfd, 0xf6, 0xc7, 0xad, 0xed, 0xcf, - 0xe9, 0x65, 0xd7, 0x5e, 0xbf, 0xd5, 0xef, 0x6c, 0x5b, 0xf2, 0x25, 0x57, 0xc1, 0x11, 0x32, 0xac, - 0x02, 0xc5, 0x56, 0x77, 0x7b, 0xef, 0xd0, 0xec, 0x35, 0xb2, 0xec, 0x15, 0x58, 0x57, 0xb4, 0xba, - 0x7d, 0x78, 0x70, 0xd0, 0xe9, 0x23, 0x33, 0xec, 0x7f, 0x7e, 0x24, 0x48, 0xf3, 0xbe, 0x0d, 0xe5, - 0xf8, 0x29, 0x5a, 0x64, 0x30, 0x9d, 0x7e, 0xa7, 0xd5, 0x8f, 0xb9, 0x6b, 0xe3, 0x86, 0xe0, 0x5f, - 0x31, 0x18, 0x5f, 0x92, 0x6d, 0x64, 0xe8, 0xa6, 0x9c, 0x02, 0x52, 0xeb, 0x8d, 0xac, 0xd8, 0x54, - 0x31, 0x74, 0xeb, 0xb0, 0x2f, 0x86, 0xf0, 0x3d, 0xa8, 0x27, 0xe3, 0x21, 0x93, 0x86, 0xed, 0x0d, - 0x58, 0xdb, 0x6a, 0xf7, 0x3f, 0x6b, 0xb7, 0xbb, 0x38, 0x3b, 0xdb, 0xed, 0x6e, 0xdf, 0x6c, 0xed, - 0x77, 0xfa, 0x9f, 0x37, 0x32, 0xf7, 0x3f, 0x82, 0xc6, 0xac, 0xf3, 0x31, 0xe1, 0xad, 0x7d, 0x9e, - 0x5b, 0xf7, 0xfe, 0x7f, 0xc9, 0xc0, 0x4a, 0x9a, 0xdd, 0x5d, 0xac, 0xa1, 0xdc, 0x9c, 0x82, 0x45, - 0xf7, 0x0e, 0xbb, 0x56, 0xf7, 0x10, 0x9f, 0x8e, 0xdc, 0x80, 0xb5, 0x99, 0x0c, 0xc5, 0x09, 0x32, - 0xec, 0x16, 0xac, 0xcf, 0x15, 0xb2, 0xcc, 0xc3, 0x63, 0x1c, 0x76, 0x13, 0x56, 0x66, 0x32, 0xdb, - 0xa6, 0x79, 0x68, 0x36, 0x72, 0xec, 0x3d, 0xb8, 0x37, 0x93, 0x33, 0x7f, 0x30, 0xa9, 0x73, 0x2b, - 0xcf, 0xde, 0x86, 0xd7, 0xe7, 0xb0, 0x63, 0xde, 0x6d, 0x6d, 0xb5, 0xf6, 0xc5, 0xf0, 0x1a, 0x85, - 0xfb, 0xff, 0x24, 0x07, 0x10, 0x5f, 0x38, 0x12, 0xed, 0xef, 0xb4, 0xfa, 0xad, 0xfd, 0x43, 0x41, - 0x5e, 0xe6, 0x61, 0x5f, 0xd4, 0x6e, 0xb6, 0x3f, 0x69, 0xdc, 0x48, 0xcd, 0x39, 0x3c, 0x12, 0x03, - 0x5a, 0x87, 0x65, 0x5a, 0xaa, 0x7d, 0x31, 0x8c, 0x4e, 0xf7, 0x63, 0x7a, 0x85, 0x14, 0x4f, 0xbf, - 0xe3, 0xa3, 0x5d, 0xf3, 0xb0, 0xdb, 0xb7, 0x7a, 0x7b, 0xc7, 0xfd, 0x1d, 0x7c, 0xc3, 0x74, 0xdb, - 0xec, 0x1c, 0x51, 0x9d, 0xf9, 0xe7, 0x21, 0x88, 0xaa, 0x0b, 0x62, 0x2f, 0x7c, 0x7c, 0xd8, 0xeb, - 0x75, 0x8e, 0xac, 0x4f, 0x8e, 0xdb, 0x66, 0xa7, 0xdd, 0xc3, 0x82, 0x0b, 0x29, 0x70, 0x81, 0x5f, - 0x14, 0x67, 0x66, 0x7f, 0xff, 0x53, 0x79, 0xa8, 0x09, 0xd4, 0x52, 0x12, 0x24, 0xb0, 0xca, 0x62, - 0x75, 0xc4, 0xa9, 0x90, 0x52, 0x33, 0x5c, 0x93, 0x27, 0xca, 0x55, 0xc4, 0x79, 0x37, 0xb7, 0x49, - 0xb0, 0x58, 0x35, 0x3d, 0x4b, 0x94, 0xc2, 0xa3, 0x30, 0x12, 0x1c, 0x76, 0x76, 0x4c, 0x2c, 0x50, - 0x9f, 0x83, 0x0a, 0xdc, 0x45, 0x41, 0x84, 0xe2, 0xd8, 0x10, 0x28, 0x0d, 0x95, 0x10, 0x39, 0x4b, - 0x8f, 0xfe, 0xe0, 0x1d, 0x28, 0x47, 0x81, 0xc7, 0xec, 0xd7, 0xa0, 0x96, 0xb8, 0x09, 0xca, 0x94, - 0x59, 0x30, 0xed, 0xe2, 0xe8, 0xc6, 0x2b, 0xe9, 0x99, 0x52, 0x66, 0x7e, 0xf5, 0x2f, 0xfc, 0xc1, - 0x7f, 0xff, 0x5b, 0xd9, 0x26, 0x5b, 0x7b, 0x70, 0xf1, 0xfe, 0x03, 0x79, 0xd3, 0xf2, 0x01, 0xde, - 0xdc, 0xa6, 0x97, 0x1b, 0x9f, 0x6a, 0x1a, 0x08, 0x35, 0xf6, 0xca, 0xac, 0x56, 0x90, 0x68, 0xed, - 0xf6, 0x35, 0xb9, 0xb2, 0xb9, 0x57, 0xb0, 0xb9, 0x35, 0xb6, 0xa2, 0x37, 0xa7, 0xe2, 0x55, 0x19, - 0xc7, 0xe7, 0x54, 0xf5, 0x8f, 0x1a, 0xb2, 0xdb, 0xf1, 0xdb, 0x96, 0x29, 0x1f, 0x3b, 0xdc, 0xb8, - 0x39, 0xff, 0xf9, 0x41, 0xf9, 0xbd, 0x42, 0xa3, 0x89, 0x4d, 0x31, 0xd6, 0x10, 0x4d, 0xe9, 0x5f, - 0x24, 0x64, 0x27, 0x50, 0xd1, 0xbe, 0xe2, 0xc3, 0x6e, 0x5e, 0xfb, 0xc5, 0xa1, 0x8d, 0x8d, 0xb4, - 0xac, 0xb4, 0xa1, 0xe8, 0xf5, 0x3f, 0x38, 0xe5, 0x9c, 0xfd, 0x22, 0x94, 0xa3, 0xef, 0xbd, 0xb0, - 0x75, 0xed, 0x5b, 0x3d, 0xfa, 0x57, 0x6b, 0x36, 0x9a, 0xf3, 0x19, 0x4a, 0x09, 0xc2, 0xda, 0x57, - 0x8d, 0xb9, 0xde, 0x7f, 0x3f, 0x73, 0x9f, 0x7d, 0x06, 0x15, 0xed, 0x9b, 0x2e, 0xd1, 0x00, 0xe6, - 0xbf, 0x1b, 0x13, 0x0d, 0x20, 0xe5, 0x13, 0x30, 0xc6, 0x12, 0x36, 0x51, 0x61, 0x65, 0xd1, 0x04, - 0x7e, 0xf2, 0x85, 0xed, 0xc3, 0xaa, 0xd4, 0xb6, 0x4e, 0xf8, 0xd7, 0x59, 0x86, 0x94, 0xaf, 0x40, - 0x3e, 0xcc, 0xb0, 0x8f, 0xa0, 0xa4, 0x3e, 0xe8, 0xc3, 0xd6, 0xd2, 0x3f, 0x57, 0xb4, 0xb1, 0x3e, - 0x07, 0x97, 0xaa, 0xd1, 0xe7, 0x00, 0xf1, 0x07, 0x64, 0x98, 0x9a, 0xa8, 0xb9, 0x0f, 0xd2, 0x44, - 0x14, 0x30, 0xff, 0xb5, 0x19, 0x63, 0x0d, 0x07, 0xd8, 0x60, 0x75, 0x31, 0x40, 0x97, 0x3f, 0x53, - 0x6f, 0x5e, 0xff, 0x2a, 0x54, 0xb4, 0x6f, 0xc8, 0x44, 0xd3, 0x37, 0xff, 0xfd, 0x99, 0x68, 0xfa, - 0x52, 0x3e, 0x39, 0x63, 0x6c, 0x60, 0xed, 0x2b, 0xc6, 0xa2, 0xa8, 0x5d, 0x88, 0x5b, 0x52, 0xec, - 0x11, 0x0b, 0x74, 0x0e, 0xb5, 0xc4, 0x87, 0x62, 0xa2, 0x1d, 0x9a, 0xf6, 0x19, 0x9a, 0x68, 0x87, - 0xa6, 0x7e, 0x5b, 0x46, 0xd1, 0x99, 0xb1, 0x24, 0xda, 0xa1, 0x57, 0xad, 0xb4, 0x96, 0x7e, 0x0c, - 0x15, 0xed, 0xa3, 0x2f, 0xd1, 0x58, 0xe6, 0xbf, 0x2f, 0x13, 0x8d, 0x25, 0xed, 0x1b, 0x31, 0x2b, - 0xd8, 0x46, 0xdd, 0x40, 0x52, 0xc0, 0x47, 0x79, 0x45, 0xdd, 0xbf, 0x06, 0xf5, 0xe4, 0x77, 0x60, - 0xa2, 0xbd, 0x9f, 0xfa, 0x41, 0x99, 0x68, 0xef, 0x5f, 0xf3, 0xf1, 0x18, 0x49, 0xd2, 0xf7, 0x97, - 0xa3, 0x46, 0x1e, 0x7c, 0x29, 0xaf, 0x50, 0x7d, 0xc5, 0x3e, 0x11, 0x0c, 0x4e, 0x3e, 0x1a, 0xcd, - 0xd6, 0x35, 0xaa, 0xd5, 0x5f, 0x9f, 0x8e, 0xf6, 0xcb, 0xdc, 0xfb, 0xd2, 0x49, 0x62, 0xc6, 0xca, - 0xd9, 0xc7, 0xb0, 0x1c, 0x11, 0x73, 0xf4, 0x0a, 0x74, 0x10, 0x8d, 0x21, 0xf5, 0xad, 0xe9, 0x8d, - 0xc6, 0x6c, 0xee, 0xc3, 0x0c, 0x3b, 0x80, 0xa2, 0x7c, 0x5a, 0x97, 0xad, 0xce, 0x3e, 0xb5, 0x4b, - 0xfd, 0x5a, 0x4b, 0x7f, 0x81, 0xd7, 0x58, 0xc6, 0x5e, 0xd5, 0x58, 0x45, 0xf4, 0xea, 0x8c, 0x87, - 0x8e, 0xa8, 0xc3, 0x85, 0xc5, 0xd9, 0x27, 0x97, 0x6f, 0x5f, 0xf7, 0x44, 0x05, 0x55, 0xff, 0xea, - 0xf3, 0x5f, 0xb0, 0x48, 0xb2, 0x22, 0xc5, 0x4d, 0x1f, 0xc8, 0x88, 0x1d, 0xf6, 0xcb, 0x50, 0xd5, - 0xbf, 0x1d, 0xc1, 0x74, 0x9e, 0x30, 0xdb, 0xd2, 0xad, 0xd4, 0xbc, 0x24, 0x95, 0xb0, 0xaa, 0xde, - 0x0c, 0xfb, 0x14, 0xd6, 0xa2, 0x69, 0xd6, 0xdf, 0x58, 0x08, 0xd8, 0x9d, 0x94, 0x97, 0x17, 0x12, - 0x93, 0x7d, 0xf3, 0xda, 0xa7, 0x19, 0x1e, 0x66, 0x04, 0xf5, 0x25, 0xdf, 0xc9, 0x8f, 0x4f, 0x9e, - 0xb4, 0xcf, 0x03, 0xc4, 0x27, 0x4f, 0xea, 0xe3, 0xfa, 0x8a, 0xfa, 0xd8, 0x72, 0x62, 0x8e, 0x28, - 0x96, 0x99, 0xfd, 0x18, 0x16, 0xb5, 0x07, 0x24, 0x7a, 0x57, 0xee, 0x20, 0xda, 0x49, 0xf3, 0x8f, - 0xa9, 0x6e, 0xa4, 0xd9, 0x27, 0x8d, 0x75, 0xac, 0x7f, 0xc9, 0x48, 0x4c, 0x8e, 0xd8, 0x45, 0xdb, - 0x50, 0xd1, 0x1f, 0xa7, 0x78, 0x4e, 0xbd, 0xeb, 0x5a, 0x96, 0xfe, 0x6e, 0xe7, 0xc3, 0x0c, 0xdb, - 0x87, 0xc6, 0xec, 0x53, 0x72, 0x11, 0x4f, 0x49, 0x7b, 0x7e, 0x6f, 0x63, 0x26, 0x33, 0xf1, 0x00, - 0x1d, 0x3b, 0xa2, 0xdb, 0x30, 0xd1, 0x27, 0x13, 0x3d, 0x7f, 0xf6, 0x54, 0x4f, 0x7e, 0x4a, 0x31, - 0xaa, 0x2d, 0xed, 0x23, 0x9a, 0xf7, 0x32, 0x0f, 0x33, 0xec, 0x37, 0x33, 0x50, 0x4d, 0x3c, 0xa5, - 0x94, 0xb8, 0x6f, 0x30, 0x33, 0xce, 0xa6, 0x9e, 0xa7, 0x0f, 0xd4, 0x30, 0x71, 0x12, 0xf7, 0xef, - 0xff, 0x28, 0xb1, 0x48, 0x5f, 0x26, 0xdc, 0x7b, 0x9b, 0xb3, 0xdf, 0x54, 0xfc, 0x6a, 0x16, 0x41, - 0x7f, 0x9e, 0xf7, 0xab, 0x87, 0x19, 0xf6, 0xcf, 0x33, 0x50, 0x4f, 0xfa, 0xed, 0xa3, 0xe1, 0xa6, - 0x46, 0x08, 0x44, 0xa4, 0x74, 0x8d, 0xb3, 0xff, 0xc7, 0xd8, 0xcb, 0xfe, 0x7d, 0x33, 0xd1, 0x4b, - 0xf9, 0x85, 0x87, 0x3f, 0x5b, 0x6f, 0xd9, 0xcf, 0xd3, 0x27, 0x8c, 0x55, 0xfc, 0x17, 0x9b, 0xff, - 0xe4, 0x6d, 0x44, 0x7e, 0xfa, 0x07, 0x62, 0x8d, 0xdc, 0x5f, 0xcd, 0x66, 0x70, 0x25, 0x7e, 0x95, - 0x3e, 0x20, 0xa8, 0x42, 0x80, 0x04, 0x29, 0xbf, 0x74, 0x25, 0x6f, 0xe0, 0xc0, 0x5e, 0x35, 0x6e, - 0x26, 0x06, 0x36, 0x2b, 0x7d, 0xec, 0x52, 0x17, 0xe5, 0x47, 0x5e, 0xe3, 0xe3, 0x73, 0xee, 0xc3, - 0xaf, 0x2f, 0xe8, 0xe9, 0x98, 0x7a, 0x2a, 0xcb, 0x24, 0x36, 0xdd, 0xcb, 0xd6, 0x75, 0x1f, 0x3b, - 0xfc, 0x86, 0x71, 0xe7, 0xda, 0x0e, 0x3f, 0x40, 0x6f, 0xbc, 0xe8, 0xf6, 0x11, 0x40, 0x1c, 0xa9, - 0xc9, 0x66, 0xe2, 0x05, 0x23, 0x56, 0x34, 0x1f, 0xcc, 0x99, 0xdc, 0xd9, 0x2a, 0xac, 0x50, 0xd4, - 0xf8, 0x8b, 0xc4, 0x58, 0xa3, 0x48, 0x46, 0x5d, 0x0e, 0x4b, 0x06, 0x55, 0x26, 0xe4, 0xb0, 0xd9, - 0xfa, 0x13, 0x6c, 0x35, 0x0a, 0x5b, 0x3c, 0x86, 0xda, 0xbe, 0xe7, 0x3d, 0x9d, 0x4e, 0xa2, 0xdb, - 0x01, 0xc9, 0xe0, 0x9b, 0x3d, 0x3b, 0x38, 0xdf, 0x98, 0x19, 0x85, 0x71, 0x17, 0xab, 0xda, 0x60, - 0x4d, 0xad, 0xaa, 0x07, 0x5f, 0xc6, 0xe1, 0xa1, 0x5f, 0x31, 0x1b, 0x96, 0x22, 0x6e, 0x1d, 0x87, - 0x60, 0x26, 0xab, 0x49, 0xf0, 0xe8, 0xd9, 0x26, 0x12, 0x0a, 0x83, 0xea, 0xed, 0x83, 0x40, 0xd5, - 0xf9, 0x30, 0xc3, 0x8e, 0xa0, 0xba, 0xc3, 0x07, 0xf8, 0xbc, 0x04, 0x06, 0x9a, 0x2c, 0x27, 0x82, - 0x16, 0x28, 0x42, 0x65, 0xa3, 0x96, 0x00, 0x26, 0x4f, 0xb0, 0x89, 0x7d, 0xe5, 0xf3, 0x2f, 0x1e, - 0x7c, 0x29, 0x43, 0x58, 0xbe, 0x52, 0x27, 0x58, 0x1c, 0xce, 0xa4, 0x8b, 0x01, 0xc9, 0x98, 0xa0, - 0xc4, 0x09, 0x36, 0x17, 0x13, 0x94, 0x98, 0xea, 0x28, 0x78, 0x69, 0x04, 0x4b, 0x73, 0x61, 0x44, - 0xd1, 0xe1, 0x75, 0x5d, 0xf0, 0xd1, 0xc6, 0xdd, 0xeb, 0x11, 0x92, 0xad, 0xdd, 0x4f, 0xb6, 0xd6, - 0x83, 0x1a, 0xbd, 0xc2, 0x7b, 0xc2, 0xe9, 0xa2, 0xe9, 0xcc, 0x2b, 0x4d, 0xfa, 0x2d, 0xd6, 0xd9, - 0xa3, 0x06, 0xf3, 0x92, 0xb2, 0x0e, 0x5e, 0x35, 0x64, 0xa7, 0xf8, 0x6d, 0x0a, 0xed, 0x66, 0x67, - 0x44, 0x8c, 0xf3, 0xb7, 0x4d, 0x23, 0x62, 0x4c, 0xb9, 0x08, 0x6a, 0xdc, 0xc6, 0xba, 0xd7, 0xd9, - 0x6a, 0x54, 0xf7, 0x03, 0xd7, 0x1b, 0xf2, 0xb1, 0xac, 0xf5, 0x17, 0xa1, 0xf2, 0x31, 0x0f, 0xd5, - 0x55, 0xca, 0x48, 0xaa, 0x9f, 0xb9, 0x5b, 0xb9, 0x91, 0x72, 0x01, 0x36, 0x49, 0x9b, 0x54, 0x33, - 0x1f, 0x9e, 0x71, 0x62, 0x87, 0x96, 0x33, 0xfc, 0x8a, 0xfd, 0x02, 0x56, 0x1e, 0x3d, 0x1c, 0xb0, - 0xa6, 0x75, 0x53, 0xaf, 0x7c, 0x71, 0x06, 0x9e, 0x56, 0xb3, 0xe8, 0xb3, 0x26, 0x5d, 0xba, 0x50, - 0xd1, 0x1e, 0x18, 0x89, 0xe6, 0x66, 0xfe, 0x41, 0x99, 0x68, 0x6e, 0x52, 0xde, 0x23, 0x31, 0xee, - 0x61, 0x3b, 0x06, 0xbb, 0x1b, 0xb7, 0x43, 0x6f, 0x90, 0xc4, 0x2d, 0x3d, 0xf8, 0xd2, 0x1e, 0x87, - 0x5f, 0xb1, 0xcf, 0x68, 0x39, 0xb4, 0xab, 0xa2, 0xb1, 0x9a, 0x32, 0x7b, 0xab, 0x34, 0x9a, 0x2c, - 0x2d, 0x2b, 0xa9, 0xba, 0x50, 0x53, 0x28, 0x3b, 0x3e, 0x06, 0xe8, 0x85, 0xde, 0x64, 0xc7, 0xe6, - 0x63, 0xcf, 0x8d, 0x19, 0x7b, 0x7c, 0x79, 0x31, 0xe6, 0x93, 0xda, 0x0d, 0x46, 0xf6, 0x99, 0xa6, - 0xd7, 0x25, 0x2e, 0x39, 0x2b, 0x22, 0xbe, 0xf6, 0x7e, 0x63, 0x34, 0x21, 0x29, 0x77, 0x1c, 0x1f, - 0x66, 0x58, 0x0b, 0x20, 0x8e, 0x57, 0x8b, 0xb4, 0xb4, 0xb9, 0x50, 0xb8, 0x88, 0xbd, 0xa6, 0x04, - 0xb7, 0x1d, 0x41, 0x39, 0x0e, 0xf4, 0x59, 0x8f, 0xdf, 0x4b, 0x4a, 0x84, 0x05, 0x45, 0x32, 0xc3, - 0x5c, 0x90, 0x8d, 0xd1, 0xc0, 0xa9, 0x02, 0x56, 0x12, 0x53, 0x75, 0xca, 0x79, 0xc0, 0x1c, 0x58, - 0xa6, 0x0e, 0x46, 0x02, 0x1a, 0x5e, 0xba, 0x8b, 0xbe, 0x08, 0x33, 0x1f, 0xef, 0x12, 0x71, 0x8d, - 0xd4, 0xa8, 0x8d, 0x9b, 0xd8, 0xc2, 0xb2, 0x51, 0x57, 0xa7, 0x0c, 0x5d, 0xf8, 0x13, 0x47, 0xc0, - 0x18, 0x96, 0xe6, 0x02, 0x03, 0x22, 0xd6, 0x71, 0x5d, 0xa4, 0x47, 0xc4, 0x3a, 0xae, 0x8d, 0x29, - 0x30, 0x56, 0xb1, 0xc9, 0x45, 0x03, 0x50, 0xb9, 0x7c, 0xe6, 0x84, 0x83, 0x73, 0xd1, 0xdc, 0x6f, - 0x67, 0x60, 0x39, 0xc5, 0xf5, 0xcf, 0x5e, 0x53, 0x76, 0x8a, 0x6b, 0xc3, 0x02, 0x36, 0x52, 0x5d, - 0xc4, 0x46, 0x0f, 0xdb, 0x39, 0x60, 0x4f, 0x12, 0x07, 0x28, 0x79, 0x68, 0xe5, 0xce, 0x7c, 0xae, - 0x18, 0x93, 0x2a, 0xc3, 0x7c, 0x01, 0xeb, 0xd4, 0x91, 0xd6, 0x68, 0x34, 0xe3, 0xbe, 0x7e, 0x55, - 0xeb, 0x45, 0x8a, 0x4b, 0x3e, 0xa1, 0x11, 0x24, 0xdd, 0xf2, 0xd7, 0x08, 0xf0, 0xd4, 0x55, 0x36, - 0x85, 0xc6, 0xac, 0x5b, 0x98, 0x5d, 0x5f, 0xd7, 0xc6, 0x9d, 0x84, 0xc6, 0x9d, 0xe2, 0x4a, 0x7e, - 0x13, 0x1b, 0xbb, 0x63, 0x6c, 0xa4, 0xcd, 0x0b, 0x29, 0xe1, 0x62, 0x3d, 0xfe, 0x7c, 0xe4, 0xc3, - 0x9e, 0x19, 0xe7, 0x9d, 0xe8, 0x89, 0xfb, 0x74, 0x8f, 0x7b, 0xa4, 0xf3, 0xa7, 0xbb, 0xc0, 0xdf, - 0xc2, 0xe6, 0xef, 0x1a, 0xb7, 0xd2, 0x9a, 0xf7, 0xa9, 0x08, 0x69, 0xff, 0xeb, 0xb3, 0xfb, 0x5a, - 0xf5, 0xe0, 0x6e, 0xda, 0x7a, 0x5f, 0xab, 0x7d, 0xcd, 0xcc, 0xf5, 0x0d, 0x14, 0x24, 0xab, 0xba, - 0xcf, 0x3a, 0xda, 0x3e, 0x29, 0xce, 0xf1, 0x68, 0xfb, 0xa4, 0x39, 0xb9, 0x93, 0xf2, 0x93, 0x72, - 0x6f, 0x7f, 0x3f, 0x73, 0x7f, 0xeb, 0xed, 0x1f, 0xbf, 0x79, 0xe6, 0x84, 0xe7, 0xd3, 0x93, 0xcd, - 0x81, 0x37, 0x7e, 0x30, 0x52, 0xf6, 0x4d, 0x79, 0x33, 0xfd, 0xc1, 0xc8, 0x1d, 0x3e, 0xc0, 0x6a, - 0x4f, 0x16, 0x26, 0xbe, 0x17, 0x7a, 0xdf, 0xfe, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x06, 0xce, - 0x0f, 0x99, 0x57, 0x87, 0x00, 0x00, + // 11204 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0xbd, 0x4d, 0x6c, 0x23, 0x49, + 0x96, 0x18, 0x5c, 0xfc, 0x13, 0xc9, 0x47, 0x52, 0xa2, 0x42, 0x7f, 0x2c, 0x55, 0x57, 0x57, 0x75, + 0x76, 0x4f, 0x77, 0x4d, 0x75, 0x8f, 0xba, 0xba, 0xa6, 0xab, 0x7f, 0xa6, 0xbe, 0xed, 0x19, 0x4a, + 0xa2, 0x4a, 0x9c, 0x92, 0x48, 0x75, 0x92, 0xaa, 0xde, 0x5e, 0xec, 0xb7, 0xe9, 0x14, 0x19, 0x92, + 0xd2, 0x45, 0x66, 0xb2, 0x33, 0x93, 0x2a, 0x69, 0x0c, 0xdf, 0xfc, 0x87, 0x85, 0x6d, 0xc0, 0x80, + 0xd7, 0x80, 0x7f, 0x16, 0xfe, 0x59, 0xd8, 0xbe, 0x2d, 0x0c, 0xcf, 0xda, 0x80, 0x01, 0x9f, 0xbd, + 0x17, 0x1b, 0x86, 0xe1, 0xf5, 0xc1, 0xc6, 0x62, 0x01, 0x1f, 0xbc, 0xbe, 0x19, 0x0b, 0xf8, 0xe4, + 0x83, 0x0d, 0x23, 0xde, 0x8b, 0xc8, 0x8c, 0x24, 0x53, 0x55, 0xd5, 0xb3, 0xed, 0xb9, 0x48, 0xcc, + 0xf7, 0x5e, 0xfc, 0x64, 0xc4, 0x8b, 0x17, 0xef, 0x2f, 0x22, 0xa1, 0xec, 0x4f, 0x06, 0x5b, 0x13, + 0xdf, 0x0b, 0x3d, 0x56, 0x18, 0xb9, 0xfe, 0x64, 0x60, 0xfc, 0x71, 0x06, 0xf2, 0xc7, 0xe1, 0xa5, + 0xc7, 0x1e, 0x41, 0xd5, 0x1e, 0x0e, 0x7d, 0x1e, 0x04, 0x56, 0x78, 0x35, 0xe1, 0x8d, 0xcc, 0xdd, + 0xcc, 0xbd, 0xc5, 0x87, 0x6c, 0x0b, 0xc9, 0xb6, 0x9a, 0x84, 0xea, 0x5f, 0x4d, 0xb8, 0x59, 0xb1, + 0xe3, 0x07, 0xd6, 0x80, 0xa2, 0x7c, 0x6c, 0x64, 0xef, 0x66, 0xee, 0x95, 0x4d, 0xf5, 0xc8, 0x6e, + 0x03, 0xd8, 0x63, 0x6f, 0xea, 0x86, 0x56, 0x60, 0x87, 0x8d, 0xdc, 0xdd, 0xcc, 0xbd, 0x9c, 0x59, + 0x26, 0x48, 0xcf, 0x0e, 0xd9, 0x2d, 0x28, 0x4f, 0x9e, 0x5b, 0xc1, 0xc0, 0x77, 0x26, 0x61, 0x23, + 0x8f, 0x45, 0x4b, 0x93, 0xe7, 0x3d, 0x7c, 0x66, 0xef, 0x43, 0xc9, 0x9b, 0x86, 0x13, 0xcf, 0x71, + 0xc3, 0x46, 0xe1, 0x6e, 0xe6, 0x5e, 0xe5, 0xe1, 0x92, 0xec, 0x48, 0x77, 0x1a, 0x1e, 0x09, 0xb0, + 0x19, 0x11, 0xb0, 0x77, 0xa0, 0x36, 0xf0, 0xdc, 0x53, 0xc7, 0x1f, 0xdb, 0xa1, 0xe3, 0xb9, 0x41, + 0x63, 0x01, 0xdb, 0x4a, 0x02, 0x8d, 0x7f, 0x93, 0x85, 0x4a, 0xdf, 0xb7, 0xdd, 0xc0, 0x1e, 0x08, + 0x00, 0xdb, 0x80, 0x62, 0x78, 0x69, 0x9d, 0xdb, 0xc1, 0x39, 0xbe, 0x6a, 0xd9, 0x5c, 0x08, 0x2f, + 0xf7, 0xed, 0xe0, 0x9c, 0xad, 0xc3, 0x02, 0xf5, 0x12, 0x5f, 0x28, 0x67, 0xca, 0x27, 0xf6, 0x3e, + 0x2c, 0xbb, 0xd3, 0xb1, 0x95, 0x6c, 0x4a, 0xbc, 0x56, 0xc1, 0xac, 0xbb, 0xd3, 0xf1, 0x8e, 0x0e, + 0x17, 0x2f, 0x7f, 0x32, 0xf2, 0x06, 0xcf, 0xa9, 0x01, 0x7a, 0xbd, 0x32, 0x42, 0xb0, 0x8d, 0xb7, + 0xa0, 0x2a, 0xd1, 0xdc, 0x39, 0x3b, 0xa7, 0x77, 0x2c, 0x98, 0x15, 0x22, 0x40, 0x90, 0xa8, 0x21, + 0x74, 0xc6, 0xdc, 0x0a, 0x42, 0x7b, 0x3c, 0x91, 0xaf, 0x54, 0x16, 0x90, 0x9e, 0x00, 0x20, 0xda, + 0x0b, 0xed, 0x91, 0x75, 0xca, 0x79, 0xd0, 0x28, 0x4a, 0xb4, 0x80, 0xec, 0x71, 0x1e, 0xb0, 0xef, + 0xc1, 0xe2, 0x90, 0x07, 0xa1, 0x25, 0x27, 0x83, 0x07, 0x8d, 0xd2, 0xdd, 0xdc, 0xbd, 0xb2, 0x59, + 0x13, 0xd0, 0xa6, 0x02, 0xb2, 0x37, 0x00, 0x7c, 0xfb, 0x85, 0x25, 0x06, 0x82, 0x5f, 0x36, 0xca, + 0x34, 0x0b, 0xbe, 0xfd, 0xa2, 0x7f, 0xb9, 0xcf, 0x2f, 0xd9, 0x2a, 0x14, 0x46, 0xf6, 0x09, 0x1f, + 0x35, 0x00, 0x11, 0xf4, 0x60, 0xfc, 0x1a, 0xac, 0x3f, 0xe1, 0xa1, 0x36, 0x94, 0x81, 0xc9, 0xbf, + 0x99, 0xf2, 0x20, 0x14, 0x6f, 0x15, 0x84, 0xb6, 0x1f, 0xaa, 0xb7, 0xca, 0xd0, 0x5b, 0x21, 0x2c, + 0x7e, 0x2b, 0xee, 0x0e, 0x15, 0x41, 0x16, 0x09, 0xca, 0xdc, 0x1d, 0x12, 0xda, 0x38, 0x00, 0xa6, + 0x55, 0xbc, 0xcb, 0x43, 0xdb, 0x19, 0x05, 0xec, 0x13, 0xa8, 0x86, 0x5a, 0x73, 0x8d, 0xcc, 0xdd, + 0xdc, 0xbd, 0x4a, 0xc4, 0x9a, 0x5a, 0x01, 0x33, 0x41, 0x67, 0x9c, 0x43, 0x69, 0x8f, 0xf3, 0x03, + 0x67, 0xec, 0x84, 0x6c, 0x1d, 0x0a, 0xa7, 0xce, 0x25, 0x1f, 0x62, 0xa7, 0x72, 0xfb, 0x37, 0x4c, + 0x7a, 0x64, 0x77, 0x00, 0xf0, 0x87, 0x35, 0x8e, 0xb8, 0x74, 0xff, 0x86, 0x59, 0x46, 0xd8, 0x61, + 0x60, 0x87, 0x6c, 0x13, 0x8a, 0x13, 0xee, 0x0f, 0xb8, 0xe2, 0x87, 0xfd, 0x1b, 0xa6, 0x02, 0x6c, + 0x17, 0xa1, 0x30, 0x12, 0xb5, 0x1b, 0xbf, 0x5f, 0x80, 0x4a, 0x8f, 0xbb, 0x43, 0x35, 0x12, 0x0c, + 0xf2, 0x62, 0xa0, 0xb1, 0xb1, 0xaa, 0x89, 0xbf, 0xd9, 0xdb, 0x50, 0xc1, 0x29, 0x09, 0x42, 0xdf, + 0x71, 0xcf, 0x68, 0xb5, 0x6c, 0x67, 0x1b, 0x19, 0x13, 0x04, 0xb8, 0x87, 0x50, 0x56, 0x87, 0x9c, + 0x3d, 0x56, 0xab, 0x45, 0xfc, 0x64, 0x37, 0xa1, 0x64, 0x8f, 0x43, 0xea, 0x5e, 0x15, 0xc1, 0x45, + 0x7b, 0x1c, 0x62, 0xd7, 0xde, 0x82, 0xea, 0xc4, 0xbe, 0x1a, 0x73, 0x37, 0x8c, 0xd9, 0xac, 0x6a, + 0x56, 0x24, 0x0c, 0x19, 0xed, 0x21, 0xac, 0xe8, 0x24, 0xaa, 0xf1, 0x42, 0xd4, 0xf8, 0xb2, 0x46, + 0x2d, 0xfb, 0xf0, 0x1e, 0x2c, 0xa9, 0x32, 0x3e, 0xbd, 0x0f, 0xb2, 0x5f, 0xd9, 0x5c, 0x94, 0x60, + 0xf5, 0x96, 0xf7, 0xa0, 0x7e, 0xea, 0xb8, 0xf6, 0xc8, 0x1a, 0x8c, 0xc2, 0x0b, 0x6b, 0xc8, 0x47, + 0xa1, 0x8d, 0x9c, 0x58, 0x30, 0x17, 0x11, 0xbe, 0x33, 0x0a, 0x2f, 0x76, 0x05, 0x94, 0x7d, 0x00, + 0xe5, 0x53, 0xce, 0x2d, 0x1c, 0xac, 0x46, 0x29, 0xb1, 0xa0, 0xd5, 0x0c, 0x99, 0xa5, 0x53, 0x35, + 0x57, 0x1f, 0x40, 0xdd, 0x9b, 0x86, 0x67, 0x9e, 0xe3, 0x9e, 0x59, 0x83, 0x73, 0xdb, 0xb5, 0x9c, + 0x21, 0xf2, 0x66, 0x7e, 0x3b, 0xfb, 0x20, 0x63, 0x2e, 0x2a, 0xdc, 0xce, 0xb9, 0xed, 0xb6, 0x87, + 0xec, 0x5d, 0x58, 0x1a, 0xd9, 0x41, 0x68, 0x9d, 0x7b, 0x13, 0x6b, 0x32, 0x3d, 0x79, 0xce, 0xaf, + 0x1a, 0x35, 0x1c, 0x88, 0x9a, 0x00, 0xef, 0x7b, 0x93, 0x23, 0x04, 0x0a, 0xd6, 0xc3, 0x7e, 0x52, + 0x27, 0x04, 0x4b, 0xd7, 0xcc, 0xb2, 0x80, 0x50, 0xa3, 0x5f, 0xc3, 0x0a, 0x4e, 0xcf, 0x60, 0x1a, + 0x84, 0xde, 0xd8, 0xf2, 0xf9, 0xc0, 0xf3, 0x87, 0x41, 0xa3, 0x82, 0xbc, 0xf6, 0x7d, 0xd9, 0x59, + 0x6d, 0x8e, 0xb7, 0x76, 0x79, 0x10, 0xee, 0x20, 0xb1, 0x49, 0xb4, 0x2d, 0x37, 0xf4, 0xaf, 0xcc, + 0xe5, 0xe1, 0x2c, 0x9c, 0x7d, 0x00, 0xcc, 0x1e, 0x8d, 0xbc, 0x17, 0x56, 0xc0, 0x47, 0xa7, 0x96, + 0x1c, 0xc4, 0xc6, 0xe2, 0xdd, 0xcc, 0xbd, 0x92, 0x59, 0x47, 0x4c, 0x8f, 0x8f, 0x4e, 0x8f, 0x08, + 0xce, 0x3e, 0x01, 0x5c, 0xa4, 0xd6, 0x29, 0xb7, 0xc3, 0xa9, 0xcf, 0x83, 0xc6, 0xd2, 0xdd, 0xdc, + 0xbd, 0xc5, 0x87, 0xcb, 0xd1, 0x78, 0x21, 0x78, 0xdb, 0x09, 0xcd, 0xaa, 0xa0, 0x93, 0xcf, 0xc1, + 0xe6, 0x2e, 0xac, 0xa7, 0x77, 0x49, 0x30, 0x95, 0x18, 0x15, 0xc1, 0x8c, 0x79, 0x53, 0xfc, 0x14, + 0x2b, 0xfb, 0xc2, 0x1e, 0x4d, 0x39, 0x72, 0x61, 0xd5, 0xa4, 0x87, 0x1f, 0x65, 0x3f, 0xcb, 0x18, + 0xbf, 0x97, 0x81, 0x2a, 0xbd, 0x65, 0x30, 0xf1, 0xdc, 0x80, 0xb3, 0xb7, 0xa1, 0xa6, 0xb8, 0x81, + 0xfb, 0xbe, 0xe7, 0x4b, 0x69, 0xa9, 0x38, 0xaf, 0x25, 0x60, 0xec, 0xfb, 0x50, 0x57, 0x44, 0x13, + 0x9f, 0x3b, 0x63, 0xfb, 0x4c, 0x55, 0xad, 0x58, 0xe9, 0x48, 0x82, 0xd9, 0x47, 0x71, 0x7d, 0xbe, + 0x37, 0x0d, 0x39, 0xf2, 0x7a, 0xe5, 0x61, 0x55, 0xbe, 0x9e, 0x29, 0x60, 0x51, 0xed, 0xf8, 0xf4, + 0x1a, 0x7c, 0x6e, 0xfc, 0x56, 0x06, 0x98, 0xe8, 0x76, 0xdf, 0xa3, 0x0a, 0x62, 0x89, 0x94, 0x28, + 0x99, 0x79, 0xed, 0x15, 0x92, 0x7d, 0xd9, 0x0a, 0x31, 0xa0, 0x40, 0x7d, 0xcf, 0xa7, 0xf4, 0x9d, + 0x50, 0x3f, 0xcd, 0x97, 0x72, 0xf5, 0xbc, 0xf1, 0x5f, 0x72, 0xb0, 0x2a, 0xf8, 0xd4, 0xe5, 0xa3, + 0xe6, 0x60, 0xc0, 0x27, 0xd1, 0xda, 0xb9, 0x03, 0x15, 0xd7, 0x1b, 0x72, 0xc5, 0xb1, 0xd4, 0x31, + 0x10, 0x20, 0x8d, 0x5d, 0xcf, 0x6d, 0xc7, 0xa5, 0x8e, 0xd3, 0x60, 0x96, 0x11, 0x82, 0xdd, 0x7e, + 0x17, 0x96, 0x26, 0xdc, 0x1d, 0xea, 0x4b, 0x24, 0x47, 0x5c, 0x2f, 0xc1, 0x72, 0x75, 0xdc, 0x81, + 0xca, 0xe9, 0x94, 0xe8, 0x84, 0x60, 0xc9, 0x23, 0x0f, 0x80, 0x04, 0x35, 0x49, 0xbe, 0x4c, 0xa6, + 0xc1, 0x39, 0x62, 0x0b, 0x88, 0x2d, 0x8a, 0x67, 0x81, 0xba, 0x0d, 0x30, 0x9c, 0x06, 0xa1, 0x5c, + 0x31, 0x0b, 0x88, 0x2c, 0x0b, 0x08, 0xad, 0x98, 0x1f, 0xc0, 0xca, 0xd8, 0xbe, 0xb4, 0x90, 0x77, + 0x2c, 0xc7, 0xb5, 0x4e, 0x47, 0x28, 0xd4, 0x8b, 0x48, 0x57, 0x1f, 0xdb, 0x97, 0xcf, 0x04, 0xa6, + 0xed, 0xee, 0x21, 0x5c, 0x88, 0x95, 0x01, 0x8d, 0x84, 0xe5, 0xf3, 0x80, 0xfb, 0x17, 0x1c, 0x25, + 0x41, 0xde, 0x5c, 0x94, 0x60, 0x93, 0xa0, 0xa2, 0x47, 0x63, 0xf1, 0xde, 0xe1, 0x68, 0x40, 0xcb, + 0xde, 0x2c, 0x8e, 0x1d, 0x77, 0x3f, 0x1c, 0x0d, 0xc4, 0x7e, 0x25, 0xe4, 0xc8, 0x84, 0xfb, 0xd6, + 0xf3, 0x17, 0xb8, 0x86, 0xf3, 0x28, 0x37, 0x8e, 0xb8, 0xff, 0xf4, 0x85, 0x50, 0x29, 0x06, 0x01, + 0x0a, 0x22, 0xfb, 0xaa, 0x51, 0xc1, 0x05, 0x5e, 0x1a, 0x04, 0x42, 0x04, 0xd9, 0x57, 0x62, 0x11, + 0x8a, 0xde, 0xda, 0x38, 0x0b, 0x7c, 0x88, 0xd5, 0x07, 0x28, 0x51, 0x6b, 0xd8, 0xd9, 0xa6, 0x44, + 0x88, 0x76, 0x02, 0xc1, 0xf5, 0xaa, 0xb3, 0xa7, 0x23, 0xfb, 0x2c, 0x40, 0x91, 0x52, 0x33, 0xab, + 0x12, 0xb8, 0x27, 0x60, 0xc6, 0x57, 0xb0, 0x36, 0x33, 0xb7, 0x72, 0xcd, 0x08, 0x15, 0x02, 0x21, + 0x38, 0xaf, 0x25, 0x53, 0x3e, 0xa5, 0x4d, 0x5a, 0x36, 0x65, 0xd2, 0x8c, 0xdf, 0xce, 0x40, 0x55, + 0xd6, 0x8c, 0xca, 0x0e, 0xdb, 0x02, 0xa6, 0x66, 0x31, 0xbc, 0x74, 0x86, 0xd6, 0xc9, 0x55, 0xc8, + 0x03, 0x62, 0x9a, 0xfd, 0x1b, 0x66, 0x5d, 0xe2, 0xfa, 0x97, 0xce, 0x70, 0x5b, 0x60, 0xd8, 0x7d, + 0xa8, 0x27, 0xe8, 0x83, 0xd0, 0x27, 0x8e, 0xde, 0xbf, 0x61, 0x2e, 0x6a, 0xd4, 0xbd, 0xd0, 0x17, + 0x6b, 0x44, 0xa8, 0x52, 0xd3, 0xd0, 0x72, 0xdc, 0x21, 0xbf, 0x44, 0x36, 0xaa, 0x99, 0x15, 0x82, + 0xb5, 0x05, 0x68, 0x7b, 0x11, 0xaa, 0x7a, 0x75, 0xc6, 0x19, 0x94, 0x94, 0x1e, 0x86, 0x8a, 0xc8, + 0x4c, 0x97, 0xcc, 0x72, 0x18, 0xf5, 0xe4, 0x26, 0x94, 0x92, 0x3d, 0x30, 0x8b, 0xe1, 0x6b, 0x37, + 0x6c, 0x7c, 0x01, 0xf5, 0x03, 0xc1, 0x3c, 0xae, 0x60, 0x56, 0xa9, 0x57, 0xae, 0xc3, 0x82, 0xb6, + 0x68, 0xca, 0xa6, 0x7c, 0x12, 0x7b, 0xee, 0xb9, 0x17, 0x84, 0xb2, 0x15, 0xfc, 0x6d, 0xfc, 0x7e, + 0x06, 0x58, 0x2b, 0x08, 0x9d, 0xb1, 0x1d, 0xf2, 0x3d, 0x1e, 0x89, 0x85, 0x2e, 0x54, 0x45, 0x6d, + 0x7d, 0xaf, 0x49, 0x8a, 0x1e, 0x29, 0x14, 0xef, 0xcb, 0x65, 0x3c, 0x5f, 0x60, 0x4b, 0xa7, 0x26, + 0x31, 0x9f, 0xa8, 0x40, 0xac, 0xb2, 0xd0, 0xf6, 0xcf, 0x78, 0x88, 0xea, 0xa1, 0xd4, 0x6b, 0x80, + 0x40, 0x42, 0x31, 0xdc, 0xfc, 0x31, 0x2c, 0xcf, 0xd5, 0xa1, 0xcb, 0xe5, 0x72, 0x8a, 0x5c, 0xce, + 0xe9, 0x72, 0xd9, 0x82, 0x95, 0x44, 0xbf, 0x24, 0xa7, 0x6d, 0x40, 0x51, 0x2c, 0x08, 0xa1, 0x1c, + 0x64, 0x48, 0x5b, 0x3d, 0xe5, 0x5c, 0xa8, 0xd7, 0x1f, 0xc2, 0xea, 0x29, 0xe7, 0xbe, 0x1d, 0x22, + 0x12, 0x57, 0x8c, 0x98, 0x21, 0x59, 0xf1, 0xb2, 0xc4, 0xf5, 0xec, 0xf0, 0x88, 0xfb, 0x62, 0xa6, + 0x8c, 0xff, 0x95, 0x81, 0x25, 0x21, 0x41, 0x0f, 0x6d, 0xf7, 0x4a, 0x8d, 0xd3, 0x41, 0xea, 0x38, + 0xdd, 0xd3, 0x36, 0x43, 0x8d, 0xfa, 0xdb, 0x0e, 0x52, 0x6e, 0x76, 0x90, 0xd8, 0x5d, 0xa8, 0x26, + 0xfa, 0x5a, 0xc0, 0xbe, 0x42, 0x10, 0x75, 0x32, 0xd6, 0x48, 0x17, 0x34, 0x8d, 0xf4, 0x4f, 0x3f, + 0xb8, 0xef, 0x42, 0x3d, 0x7e, 0x19, 0x39, 0xb2, 0x0c, 0xf2, 0x82, 0x51, 0x65, 0x05, 0xf8, 0xdb, + 0xf8, 0xe7, 0x19, 0x22, 0xdc, 0xf1, 0x9c, 0x58, 0xeb, 0x65, 0x90, 0x17, 0x5a, 0xb6, 0x22, 0x14, + 0xbf, 0xaf, 0xb5, 0x21, 0xbe, 0x83, 0x21, 0xb8, 0x09, 0xa5, 0x40, 0xa8, 0xd0, 0xf6, 0x88, 0x46, + 0xa1, 0x64, 0x16, 0xc5, 0x73, 0x73, 0x34, 0x8a, 0x47, 0xa7, 0xa8, 0xeb, 0xeb, 0xef, 0xc1, 0xb2, + 0xd6, 0xe7, 0x97, 0xbc, 0x5d, 0x07, 0xd8, 0x81, 0x13, 0x84, 0xc7, 0x6e, 0x30, 0xd1, 0x94, 0xbc, + 0x5b, 0x50, 0x16, 0xd2, 0x58, 0xf4, 0x37, 0x90, 0x1a, 0xbd, 0x10, 0xcf, 0xa2, 0xb7, 0x01, 0x22, + 0xed, 0x4b, 0x89, 0xcc, 0x4a, 0xa4, 0x7d, 0x89, 0x48, 0xe3, 0x33, 0x58, 0x49, 0xd4, 0x27, 0x9b, + 0x7e, 0x0b, 0x0a, 0xd3, 0xf0, 0xd2, 0x53, 0x6a, 0x7c, 0x45, 0x72, 0x93, 0x30, 0x42, 0x4d, 0xc2, + 0x18, 0x8f, 0x61, 0xb9, 0xc3, 0x5f, 0xc8, 0x05, 0xaf, 0x3a, 0xf2, 0x2e, 0xe4, 0x5f, 0x61, 0x98, + 0x22, 0xde, 0xd8, 0x02, 0xa6, 0x17, 0x96, 0xad, 0x6a, 0x76, 0x6a, 0x26, 0x61, 0xa7, 0x1a, 0xef, + 0x02, 0xeb, 0x39, 0x67, 0xee, 0x21, 0x0f, 0x02, 0xfb, 0x2c, 0x12, 0x11, 0x75, 0xc8, 0x8d, 0x83, + 0x33, 0x29, 0xcf, 0xc4, 0x4f, 0xe3, 0x87, 0xb0, 0x92, 0xa0, 0x93, 0x15, 0xbf, 0x01, 0xe5, 0xc0, + 0x39, 0x73, 0x51, 0x09, 0x93, 0x55, 0xc7, 0x00, 0x63, 0x0f, 0x56, 0x9f, 0x71, 0xdf, 0x39, 0xbd, + 0x7a, 0x55, 0xf5, 0xc9, 0x7a, 0xb2, 0xb3, 0xf5, 0xb4, 0x60, 0x6d, 0xa6, 0x1e, 0xd9, 0x3c, 0x31, + 0xb5, 0x9c, 0xc9, 0x92, 0x49, 0x0f, 0x9a, 0x8c, 0xcc, 0xea, 0x32, 0xd2, 0x38, 0x06, 0xb6, 0xe3, + 0xb9, 0x2e, 0x1f, 0x84, 0x47, 0x9c, 0xfb, 0xaa, 0x33, 0xef, 0x6b, 0x1c, 0x5c, 0x79, 0xb8, 0x21, + 0x47, 0x76, 0x56, 0xf0, 0x4a, 0xd6, 0x66, 0x90, 0x9f, 0x70, 0x7f, 0x8c, 0x15, 0x97, 0x4c, 0xfc, + 0x6d, 0xac, 0xc1, 0x4a, 0xa2, 0x5a, 0xea, 0x9b, 0xf1, 0x00, 0xd6, 0x76, 0x9d, 0x60, 0x30, 0xdf, + 0xe0, 0x06, 0x14, 0x27, 0xd3, 0x13, 0x2b, 0x29, 0xc3, 0x9f, 0xf2, 0x2b, 0xa3, 0x01, 0xeb, 0xb3, + 0x25, 0x64, 0x5d, 0x7f, 0x21, 0x03, 0xf9, 0xfd, 0xfe, 0xc1, 0x0e, 0xdb, 0x84, 0x92, 0xe3, 0x0e, + 0xbc, 0xb1, 0x50, 0xd2, 0xe8, 0x9d, 0xa3, 0xe7, 0x6b, 0x97, 0xdd, 0x2d, 0x28, 0xa3, 0x6e, 0x27, + 0xcc, 0x6b, 0xa9, 0x26, 0x95, 0x04, 0xe0, 0xc0, 0x1b, 0x3c, 0x17, 0x76, 0x3d, 0xbf, 0x9c, 0x38, + 0x3e, 0x5a, 0xee, 0xca, 0x32, 0xcd, 0x93, 0x5e, 0x10, 0x23, 0xa4, 0x81, 0xfa, 0xaf, 0x4a, 0x50, + 0x94, 0x3b, 0x33, 0xed, 0xf2, 0xa1, 0x73, 0xc1, 0xe3, 0x5d, 0x5e, 0x3c, 0x09, 0xdd, 0xc1, 0xe7, + 0x63, 0x2f, 0x8c, 0x94, 0x3b, 0x9a, 0x83, 0x2a, 0x01, 0xa5, 0x7a, 0xa7, 0x29, 0x18, 0xe4, 0xe6, + 0xc8, 0x11, 0xd1, 0x40, 0xdf, 0xf6, 0x6f, 0x41, 0x51, 0xe9, 0x09, 0xf9, 0xc8, 0xfe, 0x59, 0x18, + 0x90, 0x66, 0xb7, 0x09, 0xa5, 0x81, 0x3d, 0xb1, 0x07, 0x4e, 0x78, 0x25, 0xc5, 0x44, 0xf4, 0x2c, + 0x6a, 0x1f, 0x79, 0x03, 0x7b, 0x64, 0x9d, 0xd8, 0x23, 0xdb, 0x1d, 0x70, 0xe9, 0x3f, 0xa8, 0x22, + 0x70, 0x9b, 0x60, 0xec, 0x7b, 0xb0, 0x28, 0xfb, 0xa9, 0xa8, 0xc8, 0x8d, 0x20, 0x7b, 0xaf, 0xc8, + 0x84, 0x22, 0xea, 0x8d, 0xc7, 0x8e, 0xb0, 0x48, 0x48, 0x65, 0xcb, 0x99, 0x65, 0x82, 0xec, 0x71, + 0x7c, 0x5b, 0x89, 0x7e, 0x41, 0x43, 0x57, 0xa6, 0xa6, 0x08, 0xf8, 0x15, 0x99, 0xfd, 0xf3, 0x7a, + 0x5b, 0x4e, 0xd3, 0xdb, 0xde, 0x87, 0xe5, 0xa9, 0x1b, 0xf0, 0x30, 0x1c, 0xf1, 0x61, 0xd4, 0x97, + 0x0a, 0x12, 0xd5, 0x23, 0x84, 0xea, 0xce, 0x16, 0xac, 0x90, 0xe3, 0x23, 0xb0, 0x43, 0x2f, 0x38, + 0x77, 0x02, 0x2b, 0x10, 0xd6, 0x14, 0x99, 0xc6, 0xcb, 0x88, 0xea, 0x49, 0x4c, 0x8f, 0xcc, 0xa9, + 0x8d, 0x19, 0x7a, 0x9f, 0x0f, 0xb8, 0x73, 0xc1, 0x87, 0xa8, 0xd3, 0xe5, 0xcc, 0xb5, 0x44, 0x19, + 0x53, 0x22, 0x51, 0x41, 0x9f, 0x8e, 0xad, 0xe9, 0x64, 0x68, 0x0b, 0xc5, 0x66, 0x91, 0x14, 0x67, + 0x77, 0x3a, 0x3e, 0x26, 0x08, 0x7b, 0x00, 0x4a, 0x6b, 0x93, 0xba, 0xe4, 0x52, 0x42, 0x9e, 0x09, + 0x66, 0x35, 0xab, 0x92, 0x82, 0x94, 0xca, 0x84, 0x7e, 0x5a, 0x9f, 0xd1, 0x4f, 0x1b, 0x50, 0x9c, + 0xf8, 0xce, 0x85, 0x1d, 0xf2, 0xc6, 0x32, 0x89, 0x75, 0xf9, 0x28, 0x24, 0x83, 0xe3, 0x3a, 0xa1, + 0x63, 0x87, 0x9e, 0xdf, 0x60, 0x88, 0x8b, 0x01, 0xec, 0x3e, 0x2c, 0x23, 0x8f, 0x04, 0xa1, 0x1d, + 0x4e, 0x03, 0xa9, 0xad, 0xae, 0x20, 0x33, 0xa1, 0xbe, 0xdd, 0x43, 0x38, 0x2a, 0xac, 0xec, 0x87, + 0xb0, 0x4e, 0x6c, 0x81, 0x25, 0xa4, 0x16, 0x8e, 0xca, 0xc3, 0x2a, 0x0e, 0xc5, 0x0a, 0x62, 0x05, + 0x7f, 0x4b, 0x5d, 0x5c, 0x68, 0x12, 0x8f, 0x60, 0x43, 0xb2, 0xc9, 0x5c, 0xa9, 0x35, 0x2c, 0xb5, + 0x4a, 0xe8, 0x99, 0x62, 0x5b, 0xb0, 0x2c, 0xba, 0xe4, 0x0c, 0x2c, 0x59, 0x5a, 0xac, 0x84, 0x75, + 0xd1, 0x7b, 0xb4, 0xaa, 0x96, 0x08, 0x69, 0x22, 0xee, 0x29, 0xbf, 0x62, 0x5f, 0xc0, 0x12, 0xb1, + 0x0c, 0x9a, 0x62, 0x28, 0xe9, 0x37, 0x51, 0xd2, 0xaf, 0xc9, 0x01, 0xdd, 0x89, 0xb0, 0x28, 0xec, + 0x17, 0x07, 0x89, 0x67, 0xb1, 0x1c, 0x46, 0xce, 0x29, 0x0f, 0x9d, 0x31, 0x6f, 0x6c, 0x10, 0x83, + 0xa9, 0x67, 0xb1, 0x52, 0xa7, 0x13, 0xc4, 0x34, 0x48, 0x2e, 0xd0, 0x13, 0xf2, 0xee, 0xc8, 0x0b, + 0xb8, 0x72, 0x93, 0x35, 0x6e, 0xca, 0x45, 0x28, 0x80, 0x4a, 0xdf, 0x14, 0x4a, 0x3b, 0x19, 0x48, + 0x91, 0x33, 0xf3, 0x16, 0x32, 0x43, 0x8d, 0xec, 0x24, 0xe5, 0xd0, 0x14, 0x7b, 0xfb, 0xb9, 0xfd, + 0x42, 0x49, 0x90, 0x37, 0x70, 0x7e, 0x41, 0x80, 0xa4, 0xec, 0xf8, 0x79, 0x86, 0x36, 0x44, 0x29, + 0x3f, 0x02, 0xcd, 0x14, 0x24, 0xc9, 0x61, 0x79, 0xee, 0xe8, 0x4a, 0x0a, 0x13, 0x20, 0x50, 0xd7, + 0x1d, 0xe1, 0x6a, 0x76, 0x5c, 0x9d, 0x84, 0x64, 0x6f, 0x55, 0x01, 0x91, 0xe8, 0x0e, 0x54, 0x26, + 0xd3, 0x93, 0x91, 0x33, 0x20, 0x92, 0x1c, 0xd5, 0x42, 0x20, 0x24, 0x10, 0xb6, 0x30, 0x71, 0x14, + 0x51, 0xe4, 0x91, 0xa2, 0x22, 0x61, 0x48, 0x82, 0xb2, 0x9d, 0xfb, 0x28, 0x4e, 0xaa, 0x26, 0xfe, + 0x36, 0xb6, 0x61, 0x35, 0xd9, 0x69, 0xb9, 0xf1, 0xdc, 0x87, 0x92, 0x94, 0x55, 0xca, 0x49, 0xb2, + 0xa8, 0x26, 0x4a, 0x9a, 0x73, 0x11, 0xde, 0xf8, 0x9d, 0x02, 0xac, 0x48, 0xe8, 0x8e, 0x18, 0xda, + 0xde, 0x74, 0x3c, 0xb6, 0xfd, 0x14, 0x21, 0x98, 0x79, 0xb9, 0x10, 0xcc, 0xce, 0x09, 0xc1, 0xa4, + 0x95, 0x4c, 0x32, 0x34, 0x69, 0x25, 0x8b, 0xb9, 0x24, 0xc3, 0x45, 0xf7, 0xc5, 0xd6, 0x24, 0xb8, + 0x4f, 0x3e, 0xdf, 0x39, 0x91, 0x5d, 0x48, 0x11, 0xd9, 0xba, 0xc0, 0x5d, 0x98, 0x11, 0xb8, 0x6f, + 0x01, 0x31, 0x8d, 0x9a, 0xfd, 0x22, 0xd9, 0x32, 0x08, 0x93, 0xae, 0xcf, 0xf7, 0x60, 0x69, 0x56, + 0xc6, 0x91, 0x30, 0x5d, 0x4c, 0x91, 0x70, 0xce, 0x98, 0xe3, 0x6e, 0xa5, 0x11, 0x97, 0xa5, 0x84, + 0x73, 0xc6, 0xfc, 0x00, 0x31, 0x8a, 0xbe, 0x05, 0x40, 0x6d, 0xe3, 0xa2, 0x01, 0x5c, 0x34, 0xef, + 0x26, 0xe7, 0x42, 0x1f, 0xf5, 0x2d, 0xf1, 0x30, 0xf5, 0x39, 0xae, 0xa2, 0x32, 0x96, 0xc4, 0x05, + 0xf4, 0x29, 0x2c, 0x7a, 0x13, 0xee, 0x5a, 0xb1, 0xac, 0xa9, 0x60, 0x55, 0x75, 0x59, 0x55, 0x5b, + 0xc1, 0xcd, 0x9a, 0xa0, 0x8b, 0x1e, 0xd9, 0xe7, 0x34, 0xc8, 0x5c, 0x2b, 0x59, 0xbd, 0xa6, 0xe4, + 0x22, 0x12, 0x46, 0xcf, 0xc6, 0x6f, 0x66, 0xa0, 0xa2, 0x75, 0x87, 0xad, 0xc1, 0xf2, 0x4e, 0xb7, + 0x7b, 0xd4, 0x32, 0x9b, 0xfd, 0xf6, 0xb3, 0x96, 0xb5, 0x73, 0xd0, 0xed, 0xb5, 0xea, 0x37, 0x04, + 0xf8, 0xa0, 0xbb, 0xd3, 0x3c, 0xb0, 0xf6, 0xba, 0xe6, 0x8e, 0x02, 0x67, 0xd8, 0x3a, 0x30, 0xb3, + 0x75, 0xd8, 0xed, 0xb7, 0x12, 0xf0, 0x2c, 0xab, 0x43, 0x75, 0xdb, 0x6c, 0x35, 0x77, 0xf6, 0x25, + 0x24, 0xc7, 0x56, 0xa1, 0xbe, 0x77, 0xdc, 0xd9, 0x6d, 0x77, 0x9e, 0x58, 0x3b, 0xcd, 0xce, 0x4e, + 0xeb, 0xa0, 0xb5, 0x5b, 0xcf, 0xb3, 0x1a, 0x94, 0x9b, 0xdb, 0xcd, 0xce, 0x6e, 0xb7, 0xd3, 0xda, + 0xad, 0x17, 0x8c, 0x3f, 0xca, 0xc0, 0x1a, 0x0e, 0xd4, 0x70, 0x76, 0x85, 0xde, 0x85, 0xca, 0xc0, + 0xf3, 0x26, 0xc2, 0x64, 0x8a, 0xb7, 0x7b, 0x1d, 0x24, 0x56, 0x1f, 0x49, 0xd6, 0x53, 0xcf, 0x1f, + 0x70, 0xb9, 0x40, 0x01, 0x41, 0x7b, 0x02, 0x22, 0x18, 0x44, 0x72, 0x18, 0x51, 0xd0, 0xfa, 0xac, + 0x10, 0x8c, 0x48, 0xd6, 0x61, 0xe1, 0xc4, 0xe7, 0xf6, 0xe0, 0x5c, 0x2e, 0x4d, 0xf9, 0xc4, 0xbe, + 0x1f, 0x1b, 0xf3, 0x03, 0x31, 0xe1, 0x23, 0x3e, 0x44, 0xfe, 0x2c, 0x99, 0x4b, 0x12, 0xbe, 0x23, + 0xc1, 0x62, 0xab, 0xb0, 0x4f, 0x6c, 0x77, 0xe8, 0xb9, 0x7c, 0x28, 0xad, 0x83, 0x18, 0x60, 0x1c, + 0xc1, 0xfa, 0xec, 0xfb, 0xc9, 0xc5, 0xfc, 0x89, 0xb6, 0x98, 0x49, 0x2d, 0xdf, 0xbc, 0x9e, 0x81, + 0xb4, 0x85, 0xfd, 0xd7, 0xf2, 0x90, 0x17, 0x6a, 0xda, 0xb5, 0x1a, 0x9d, 0xae, 0x77, 0xe7, 0xe6, + 0xe2, 0x43, 0xe8, 0x33, 0xa0, 0xfd, 0x9b, 0x1c, 0x53, 0x65, 0x84, 0xe0, 0xbe, 0x1d, 0xa1, 0x7d, + 0x3e, 0xb8, 0x90, 0x9e, 0x29, 0x42, 0x9b, 0x7c, 0x70, 0x81, 0x66, 0x90, 0x1d, 0x52, 0x59, 0x5a, + 0x8c, 0xc5, 0xc0, 0x0e, 0xb1, 0xa4, 0x44, 0x61, 0xb9, 0x62, 0x84, 0xc2, 0x52, 0x0d, 0x28, 0x3a, + 0xee, 0x89, 0x37, 0x75, 0x87, 0xb8, 0xf6, 0x4a, 0xa6, 0x7a, 0xc4, 0x70, 0x14, 0x8a, 0x09, 0xb1, + 0x4b, 0xd0, 0x52, 0x2b, 0x09, 0x40, 0x5f, 0xec, 0x13, 0x1f, 0x41, 0x39, 0xb8, 0x72, 0x07, 0xfa, + 0x02, 0x5b, 0x95, 0xe3, 0x23, 0xde, 0x7e, 0xab, 0x77, 0xe5, 0x0e, 0x70, 0x39, 0x95, 0x02, 0xf9, + 0x8b, 0x3d, 0x82, 0x52, 0xe4, 0xc0, 0x25, 0xf1, 0x78, 0x53, 0x2f, 0xa1, 0xbc, 0xb6, 0x64, 0x27, + 0x47, 0xa4, 0xec, 0x43, 0x58, 0x40, 0x2f, 0x6b, 0xd0, 0xa8, 0x62, 0x21, 0xa5, 0x8c, 0x8b, 0x6e, + 0x60, 0x24, 0x88, 0x0f, 0xd1, 0xe3, 0x6a, 0x4a, 0xb2, 0xcd, 0xa7, 0x50, 0x4b, 0xd4, 0xa5, 0xdb, + 0xbd, 0x35, 0xb2, 0x7b, 0xdf, 0xd1, 0xed, 0xde, 0x58, 0x4c, 0xcb, 0x62, 0xba, 0x1d, 0xfc, 0x63, + 0x28, 0xa9, 0x57, 0x11, 0x8b, 0xe8, 0xb8, 0xf3, 0xb4, 0xd3, 0xfd, 0xaa, 0x63, 0xf5, 0xbe, 0xee, + 0xec, 0xd4, 0x6f, 0xb0, 0x25, 0xa8, 0x34, 0x77, 0x70, 0x5d, 0x22, 0x20, 0x23, 0x48, 0x8e, 0x9a, + 0xbd, 0x5e, 0x04, 0xc9, 0x1a, 0x7b, 0x50, 0x9f, 0xed, 0xa9, 0xe0, 0xc9, 0x50, 0xc1, 0xa4, 0x0f, + 0x3a, 0x06, 0x08, 0xfb, 0x85, 0xdc, 0xca, 0xa4, 0x24, 0xd3, 0x83, 0xf1, 0x08, 0xea, 0x62, 0xd3, + 0x11, 0x43, 0xa5, 0x47, 0x97, 0x46, 0x42, 0xf1, 0xd2, 0xfd, 0xd0, 0x25, 0xb3, 0x42, 0x30, 0x6c, + 0xca, 0xf8, 0x04, 0x96, 0xb5, 0x62, 0xb1, 0xbd, 0x29, 0x36, 0xb2, 0x59, 0x7b, 0x13, 0xad, 0x0b, + 0xc2, 0x18, 0x1b, 0xb0, 0x26, 0x1e, 0x5b, 0x17, 0xdc, 0x0d, 0x7b, 0xd3, 0x13, 0x0a, 0x4a, 0x3a, + 0x9e, 0x2b, 0xac, 0x8e, 0x72, 0x84, 0xb9, 0x9e, 0xc9, 0xb7, 0xa4, 0x69, 0x9a, 0x45, 0xd6, 0xd8, + 0xd4, 0x5a, 0xc0, 0x82, 0x5b, 0xf8, 0x37, 0x61, 0xa2, 0x96, 0x23, 0x90, 0x18, 0xd6, 0xa3, 0x56, + 0xcb, 0xb4, 0xba, 0x9d, 0x83, 0x76, 0x47, 0x48, 0x3b, 0x31, 0xac, 0x08, 0xd8, 0xdb, 0x43, 0x48, + 0xc6, 0xa8, 0xc3, 0xe2, 0x13, 0x1e, 0xb6, 0xdd, 0x53, 0x4f, 0x0e, 0x86, 0xf1, 0x97, 0x17, 0x60, + 0x29, 0x02, 0xc5, 0x26, 0xee, 0x05, 0xf7, 0x03, 0xc7, 0x73, 0x51, 0x5b, 0x2d, 0x9b, 0xea, 0x51, + 0x48, 0x27, 0xa9, 0xa3, 0xe3, 0x16, 0xb8, 0x8a, 0x58, 0xa9, 0xd5, 0xe3, 0xfe, 0xf7, 0x1e, 0x2c, + 0x39, 0x43, 0xee, 0x86, 0x4e, 0x78, 0x65, 0x25, 0x9c, 0x6b, 0x8b, 0x0a, 0x2c, 0xf7, 0xc0, 0x55, + 0x28, 0xd8, 0x23, 0xc7, 0x56, 0xc1, 0x5e, 0x7a, 0x10, 0xd0, 0x81, 0x37, 0xf2, 0x7c, 0xd4, 0x5c, + 0xcb, 0x26, 0x3d, 0xb0, 0x07, 0xb0, 0x2a, 0x34, 0x68, 0xdd, 0xe3, 0x89, 0x02, 0x86, 0xfc, 0x7c, + 0xcc, 0x9d, 0x8e, 0x8f, 0x62, 0xaf, 0xa7, 0xc0, 0x88, 0x9d, 0x4f, 0x94, 0x90, 0xaa, 0x4e, 0x54, + 0x80, 0x8c, 0xb1, 0x65, 0x77, 0x3a, 0x6e, 0x22, 0x26, 0xa2, 0x7f, 0x08, 0x6b, 0x82, 0x3e, 0x52, + 0x8e, 0xa2, 0x12, 0x4b, 0x58, 0x42, 0x54, 0xd6, 0x96, 0xb8, 0xa8, 0xcc, 0x2d, 0x28, 0x53, 0xaf, + 0x04, 0x4b, 0x14, 0x48, 0x09, 0xc7, 0xae, 0x70, 0x3f, 0x98, 0x8b, 0xcb, 0x2e, 0xd0, 0x36, 0x3e, + 0x13, 0x97, 0xd5, 0x22, 0xbb, 0xa5, 0xd9, 0xc8, 0xee, 0x43, 0x58, 0x3b, 0x11, 0x3c, 0x7a, 0xce, + 0xed, 0x21, 0xf7, 0xad, 0x98, 0xf3, 0xc9, 0xd8, 0x58, 0x11, 0xc8, 0x7d, 0xc4, 0x45, 0x0b, 0x45, + 0x68, 0x29, 0x42, 0x6e, 0xf0, 0xa1, 0x15, 0x7a, 0x16, 0x2a, 0x2f, 0x28, 0x81, 0x4a, 0x66, 0x8d, + 0xc0, 0x7d, 0x6f, 0x47, 0x00, 0x93, 0x74, 0x67, 0xbe, 0x3d, 0x39, 0x97, 0xe6, 0x40, 0x44, 0xf7, + 0x44, 0x00, 0xd9, 0x1b, 0x50, 0x14, 0x6b, 0xc2, 0xe5, 0x14, 0xe6, 0x22, 0x85, 0x5b, 0x81, 0xd8, + 0x3b, 0xb0, 0x80, 0x6d, 0x04, 0x8d, 0x3a, 0x2e, 0x88, 0x6a, 0x2c, 0xe9, 0x1d, 0xd7, 0x94, 0x38, + 0xa1, 0x0a, 0x4e, 0x7d, 0x87, 0xc4, 0x50, 0xd9, 0xc4, 0xdf, 0xec, 0x27, 0x9a, 0x4c, 0x5b, 0xc1, + 0xb2, 0xef, 0xc8, 0xb2, 0x33, 0xac, 0x78, 0x9d, 0x78, 0xfb, 0x4e, 0xa5, 0xd5, 0x4f, 0xf3, 0xa5, + 0x4a, 0xbd, 0x6a, 0x7c, 0x0a, 0x05, 0x1a, 0x1d, 0xc1, 0x84, 0x38, 0x76, 0x19, 0xc9, 0x84, 0x08, + 0x6d, 0x40, 0xd1, 0xe5, 0xe1, 0x0b, 0xcf, 0x7f, 0xae, 0xdc, 0xcf, 0xf2, 0xd1, 0xf8, 0x19, 0xfa, + 0x42, 0xa2, 0x98, 0x3d, 0x99, 0x75, 0x82, 0x3d, 0x68, 0x7a, 0x83, 0x73, 0x5b, 0xba, 0x67, 0x4a, + 0x08, 0xe8, 0x9d, 0xdb, 0x73, 0xec, 0x91, 0x9d, 0x0f, 0xdb, 0xbf, 0x03, 0x8b, 0x2a, 0x4b, 0x20, + 0xb0, 0x46, 0xfc, 0x34, 0x94, 0xec, 0x5e, 0x95, 0x29, 0x02, 0xc1, 0x01, 0x3f, 0x0d, 0x8d, 0x43, + 0x58, 0x96, 0x0c, 0xd9, 0x9d, 0x70, 0xd5, 0xf4, 0x67, 0x69, 0xda, 0x70, 0xe5, 0xe1, 0x4a, 0x72, + 0x27, 0xa6, 0xec, 0x87, 0x84, 0x8a, 0x6c, 0x7c, 0x09, 0x4c, 0xdf, 0xa7, 0x65, 0x7d, 0x52, 0x27, + 0x55, 0x5e, 0x7b, 0x15, 0xfc, 0x8a, 0x34, 0x5f, 0x67, 0x28, 0x46, 0x27, 0x98, 0x0e, 0x06, 0x2a, + 0x7b, 0xa3, 0x64, 0xaa, 0x47, 0xe3, 0x3f, 0x66, 0x60, 0x05, 0x2b, 0x53, 0xda, 0xbc, 0x94, 0xc2, + 0xbf, 0x70, 0x27, 0xc5, 0xfc, 0xe8, 0xca, 0x11, 0x3d, 0x7c, 0x7b, 0x8f, 0x68, 0x7e, 0xce, 0x23, + 0xfa, 0x7d, 0xa8, 0x0f, 0xf9, 0xc8, 0xb9, 0xe0, 0xfe, 0x55, 0x64, 0xc8, 0x91, 0xfe, 0xbe, 0xa4, + 0xe0, 0xd2, 0x96, 0x33, 0xfe, 0x56, 0x06, 0x96, 0x49, 0x95, 0x41, 0xab, 0x58, 0x0e, 0xd4, 0x63, + 0x65, 0x06, 0x4a, 0x51, 0x25, 0xdf, 0x29, 0xde, 0xe2, 0x11, 0x4a, 0xc4, 0xfb, 0x37, 0xa4, 0x79, + 0x28, 0xa1, 0xec, 0x47, 0x68, 0x81, 0xb8, 0x16, 0x02, 0x65, 0x30, 0xf3, 0x66, 0x8a, 0xf2, 0x14, + 0x15, 0x17, 0xe6, 0x89, 0x8b, 0xa0, 0xed, 0x92, 0xb0, 0x4b, 0x05, 0xd8, 0xd8, 0x83, 0x5a, 0xa2, + 0x99, 0x84, 0x83, 0xb6, 0x4a, 0x0e, 0xda, 0xb9, 0x80, 0x49, 0x76, 0x3e, 0x60, 0x72, 0x05, 0x2b, + 0x26, 0xb7, 0x87, 0x57, 0x7b, 0x9e, 0x7f, 0x14, 0x9c, 0x84, 0x7b, 0xa4, 0x1f, 0x0a, 0xf9, 0x1e, + 0x45, 0x01, 0x13, 0x5e, 0x50, 0x15, 0x0c, 0x52, 0xc6, 0xee, 0xf7, 0x60, 0x31, 0x0e, 0x17, 0x6a, + 0x9e, 0xb4, 0x5a, 0x14, 0x31, 0x44, 0x87, 0x9a, 0x30, 0x14, 0x83, 0x93, 0x50, 0xfa, 0xd2, 0xf0, + 0xb7, 0xf1, 0x17, 0xf3, 0xc0, 0x04, 0x37, 0xcf, 0x30, 0xcc, 0x4c, 0xa0, 0x33, 0x3b, 0x17, 0xe8, + 0x7c, 0x00, 0x4c, 0x23, 0x50, 0xf1, 0xd7, 0x5c, 0x14, 0x7f, 0xad, 0xc7, 0xb4, 0x32, 0xfc, 0xfa, + 0x00, 0x56, 0xa5, 0xb2, 0x9d, 0xec, 0x2a, 0xb1, 0x06, 0x23, 0xad, 0x3b, 0xd1, 0x5f, 0x15, 0xe4, + 0x14, 0xc6, 0x3b, 0xf9, 0xca, 0x30, 0xc8, 0xa9, 0xcc, 0x76, 0x8d, 0x01, 0x17, 0x5e, 0xc9, 0x80, + 0xc5, 0x39, 0x06, 0xd4, 0x5c, 0x37, 0xa5, 0xa4, 0xeb, 0xc6, 0x80, 0x9a, 0x0a, 0x65, 0x52, 0x06, + 0x07, 0x69, 0x96, 0x15, 0x19, 0xcf, 0xc4, 0x2c, 0x8e, 0x7b, 0x50, 0x57, 0xfe, 0x95, 0xc8, 0x39, + 0x44, 0xd9, 0x09, 0xd2, 0x3d, 0xb7, 0xa3, 0x5c, 0x44, 0x09, 0x57, 0x7c, 0x65, 0xc6, 0x15, 0xff, + 0x3e, 0x2c, 0x07, 0x82, 0x7f, 0xad, 0xa9, 0x2b, 0x53, 0x94, 0xf8, 0x10, 0xed, 0xb0, 0x92, 0x59, + 0x47, 0xc4, 0x71, 0x0c, 0x9f, 0x77, 0x7c, 0xd4, 0x52, 0x1c, 0x1f, 0x8f, 0xe2, 0xa8, 0x5f, 0x70, + 0xee, 0x8c, 0x51, 0xa9, 0x88, 0xd3, 0x6e, 0xe4, 0x00, 0xf7, 0xce, 0x9d, 0xb1, 0xa9, 0x42, 0xcc, + 0xe2, 0xc1, 0xf8, 0x9f, 0x19, 0xa8, 0x0b, 0x3e, 0x48, 0x2c, 0xb1, 0xcf, 0x01, 0x85, 0xc1, 0x6b, + 0xae, 0xb0, 0x8a, 0xa0, 0x55, 0x0b, 0xec, 0x53, 0xc0, 0x15, 0x63, 0x09, 0xa3, 0x53, 0xae, 0xaf, + 0x46, 0x72, 0x7d, 0xc5, 0x32, 0x74, 0xff, 0x06, 0x19, 0x27, 0x02, 0xc2, 0x3e, 0x87, 0xb2, 0x60, + 0x4c, 0xe4, 0x12, 0x99, 0x45, 0xa6, 0x54, 0xb3, 0x94, 0x35, 0x22, 0x8a, 0x4e, 0xe4, 0x63, 0x5a, + 0xa0, 0x36, 0x9f, 0x12, 0xa8, 0xd5, 0x16, 0xf0, 0x3e, 0xc0, 0x53, 0x7e, 0x75, 0xe0, 0x0d, 0xd0, + 0x24, 0xbe, 0x0d, 0x20, 0x78, 0xf9, 0xd4, 0x1e, 0x3b, 0xd2, 0xa3, 0x53, 0x30, 0xcb, 0xcf, 0xf9, + 0xd5, 0x1e, 0x02, 0xc4, 0x44, 0x0a, 0x74, 0xbc, 0x8a, 0x0b, 0x66, 0xe9, 0x39, 0xbf, 0xa2, 0x25, + 0x6c, 0x41, 0xed, 0x29, 0xbf, 0xda, 0xe5, 0xa4, 0x85, 0x7a, 0xbe, 0x60, 0x22, 0xdf, 0x7e, 0x21, + 0xd4, 0xce, 0x44, 0x90, 0xb5, 0xe2, 0xdb, 0x2f, 0x9e, 0xf2, 0x2b, 0x15, 0xf0, 0x2d, 0x0a, 0xfc, + 0xc8, 0x1b, 0xc8, 0x7d, 0x53, 0xa5, 0x8b, 0xc4, 0x9d, 0x32, 0x17, 0x9e, 0xe3, 0x6f, 0xe3, 0x4f, + 0x32, 0x50, 0x13, 0xfd, 0x47, 0xb1, 0x2c, 0xa6, 0x4c, 0x65, 0x1d, 0x65, 0xe2, 0xac, 0xa3, 0x87, + 0x52, 0xaa, 0x91, 0x8c, 0xcf, 0x5e, 0x2f, 0xe3, 0x71, 0x6e, 0x48, 0xc0, 0x7f, 0x04, 0x65, 0x5a, + 0x96, 0x62, 0x9d, 0xe7, 0x12, 0x13, 0x9c, 0x78, 0x21, 0xb3, 0x84, 0x64, 0x4f, 0x29, 0xc9, 0x41, + 0xf3, 0x0e, 0xd2, 0x10, 0x97, 0xfd, 0xc8, 0x27, 0x98, 0x32, 0x0d, 0x85, 0x6b, 0x92, 0x1c, 0x74, + 0xd7, 0xdb, 0xc2, 0x9c, 0xeb, 0xad, 0x0b, 0x25, 0x31, 0xd5, 0xf8, 0xb2, 0x29, 0x95, 0x66, 0xd2, + 0x2a, 0x15, 0x9a, 0x80, 0x2d, 0x36, 0x05, 0x21, 0xe8, 0xb2, 0x52, 0x13, 0xb0, 0x03, 0x7e, 0x84, + 0xc2, 0x2e, 0x03, 0x15, 0x6d, 0x05, 0xa0, 0xf7, 0x32, 0x1a, 0x2f, 0x5a, 0x2e, 0x49, 0x16, 0x4f, + 0x0c, 0xf8, 0xfe, 0x0d, 0xb3, 0x36, 0x48, 0xcc, 0xc0, 0x96, 0xe4, 0x55, 0x2c, 0x99, 0x4d, 0x24, + 0x48, 0xa9, 0x8e, 0x2b, 0x06, 0x15, 0xbf, 0xb7, 0x17, 0x20, 0x2f, 0x48, 0x8d, 0xc7, 0xb0, 0xac, + 0x75, 0x83, 0xfc, 0x00, 0xaf, 0xfb, 0x86, 0xc6, 0xaf, 0x47, 0x85, 0x45, 0x1b, 0x14, 0x5f, 0x52, + 0x09, 0x23, 0x7c, 0x48, 0x2f, 0x2e, 0x13, 0x53, 0x08, 0x24, 0xc8, 0x5e, 0x3b, 0x89, 0xe1, 0x37, + 0x60, 0x45, 0xab, 0x7d, 0xcf, 0x71, 0xed, 0x91, 0xf3, 0x33, 0xdc, 0xf0, 0x03, 0xe7, 0xcc, 0x9d, + 0xa9, 0x9f, 0x40, 0xdf, 0xaa, 0xfe, 0xbf, 0x9d, 0x85, 0x55, 0xd9, 0x00, 0xa6, 0x00, 0x3a, 0x42, + 0x8b, 0x3b, 0x0c, 0xce, 0xd8, 0xe7, 0x50, 0x13, 0x63, 0x63, 0xf9, 0xfc, 0xcc, 0x09, 0x42, 0xae, + 0xe2, 0x5a, 0x29, 0x82, 0x4b, 0x6c, 0xe6, 0x82, 0xd4, 0x94, 0x94, 0xec, 0x31, 0x54, 0xb0, 0x28, + 0xf9, 0x59, 0xe4, 0x44, 0x34, 0xe6, 0x0b, 0xd2, 0x40, 0xef, 0xdf, 0x30, 0x21, 0x88, 0x87, 0xfd, + 0x31, 0x54, 0x70, 0x0e, 0x2f, 0x70, 0x20, 0x67, 0x44, 0xd5, 0xdc, 0x40, 0x8b, 0xc2, 0x93, 0x78, + 0xd8, 0x9b, 0x50, 0x23, 0x61, 0x25, 0xc7, 0x49, 0xa6, 0x16, 0x6d, 0xce, 0x17, 0x57, 0x23, 0x29, + 0x3a, 0x3f, 0xd1, 0x9e, 0xb7, 0xcb, 0x50, 0x0c, 0x7d, 0xe7, 0xec, 0x8c, 0xfb, 0xc6, 0x7a, 0x34, + 0x34, 0x42, 0x0a, 0xf3, 0x5e, 0xc8, 0x27, 0x42, 0x37, 0x37, 0xfe, 0x6d, 0x06, 0x2a, 0x52, 0xae, + 0xfe, 0xc2, 0xc1, 0xb4, 0x4d, 0x2d, 0x37, 0x97, 0x5c, 0x3a, 0x71, 0x2a, 0xee, 0x7b, 0xb0, 0x34, + 0x16, 0x7a, 0xba, 0xb0, 0x23, 0x13, 0x91, 0xb4, 0x45, 0x05, 0x96, 0x6a, 0xf2, 0x16, 0xac, 0xa0, + 0xd6, 0x1c, 0x58, 0xa1, 0x33, 0xb2, 0x14, 0x52, 0xe6, 0xc1, 0x2e, 0x13, 0xaa, 0xef, 0x8c, 0x0e, + 0x25, 0x42, 0x28, 0x8f, 0x41, 0x68, 0x9f, 0x71, 0xb9, 0xb6, 0xe9, 0xc1, 0x68, 0xc0, 0xfa, 0x8c, + 0x09, 0xa9, 0xec, 0xe3, 0xff, 0xbd, 0x0c, 0x1b, 0x73, 0x28, 0x69, 0x27, 0x47, 0x11, 0xa4, 0x91, + 0x33, 0x3e, 0xf1, 0x22, 0xff, 0x6a, 0x46, 0x8b, 0x20, 0x1d, 0x08, 0x8c, 0xf2, 0xaf, 0x72, 0x58, + 0x53, 0x0c, 0x89, 0x0e, 0xd2, 0xc8, 0xca, 0xcc, 0xa2, 0x0d, 0xf4, 0x51, 0x72, 0x13, 0x9b, 0x6d, + 0x4e, 0xc1, 0x75, 0xd5, 0x68, 0x65, 0x32, 0x07, 0x0b, 0xd8, 0x9f, 0x85, 0x46, 0xc4, 0xf7, 0x52, + 0x6d, 0xd7, 0x4c, 0x66, 0xd1, 0xd2, 0x07, 0xaf, 0x68, 0x29, 0xe1, 0xdc, 0x43, 0xdd, 0x69, 0x5d, + 0x2d, 0x19, 0xaa, 0x30, 0x6a, 0xeb, 0x02, 0xde, 0x54, 0x6d, 0xa1, 0x1a, 0x3e, 0xdf, 0x62, 0xfe, + 0xb5, 0xde, 0x0d, 0x1d, 0x97, 0x89, 0x66, 0xcd, 0x5b, 0xb2, 0xe2, 0x08, 0xa5, 0xb7, 0x7b, 0x0e, + 0xeb, 0x2f, 0x6c, 0x27, 0x54, 0xef, 0xa8, 0x59, 0xec, 0x05, 0x6c, 0xef, 0xe1, 0x2b, 0xda, 0xfb, + 0x8a, 0x0a, 0x27, 0x0c, 0x93, 0xd5, 0x17, 0xf3, 0xc0, 0x60, 0xf3, 0x1f, 0xe6, 0x60, 0x31, 0x59, + 0x8b, 0x10, 0x2c, 0x72, 0xb3, 0x51, 0xfa, 0xa6, 0x54, 0x82, 0xa5, 0xef, 0xbf, 0x43, 0x7a, 0xe6, + 0x7c, 0x54, 0x22, 0x9b, 0x12, 0x95, 0xd0, 0x83, 0x01, 0xb9, 0x57, 0x45, 0x5f, 0xf3, 0xaf, 0x15, + 0x7d, 0x2d, 0xa4, 0x45, 0x5f, 0xaf, 0x0f, 0xd9, 0x2d, 0xfc, 0x42, 0x21, 0xbb, 0xe2, 0x4b, 0x43, + 0x76, 0x5a, 0xa0, 0xb1, 0x74, 0x8d, 0x0b, 0x5f, 0x0b, 0x3d, 0xa6, 0x84, 0xec, 0xca, 0xdf, 0x22, + 0x64, 0xb7, 0xf9, 0x27, 0x19, 0x60, 0xf3, 0xab, 0x83, 0x3d, 0xa1, 0x80, 0x8f, 0xcb, 0x47, 0x52, + 0x72, 0xff, 0xe0, 0xf5, 0x56, 0x98, 0x62, 0x08, 0x55, 0x9a, 0x7d, 0x08, 0x2b, 0x7a, 0xb6, 0xbe, + 0x6e, 0xb5, 0xd7, 0x4c, 0xa6, 0xa3, 0x62, 0xdf, 0x8e, 0x16, 0xea, 0xce, 0xbf, 0x32, 0xd4, 0x5d, + 0x78, 0x65, 0xa8, 0x7b, 0x21, 0x19, 0xea, 0xde, 0xfc, 0x0f, 0x19, 0x58, 0x49, 0x61, 0xe2, 0xef, + 0xee, 0x9d, 0x05, 0xef, 0x25, 0xc4, 0x5a, 0x56, 0xf2, 0x9e, 0x2e, 0xd1, 0x0e, 0x94, 0x3f, 0x50, + 0x4c, 0x45, 0x20, 0x77, 0xaa, 0xfb, 0xaf, 0x92, 0x2e, 0x71, 0x09, 0x53, 0x2f, 0xbe, 0xf9, 0x3b, + 0x59, 0xa8, 0x68, 0x48, 0x31, 0x8a, 0xc4, 0xb2, 0x5a, 0x86, 0x11, 0x69, 0x86, 0xe8, 0x73, 0xb8, + 0x03, 0x32, 0xea, 0x41, 0x78, 0x5a, 0x5c, 0x52, 0x0d, 0x44, 0x82, 0x2d, 0x58, 0x51, 0xc1, 0x38, + 0x1e, 0x27, 0x1d, 0xca, 0xbd, 0x66, 0x59, 0x86, 0xe4, 0x78, 0x94, 0xc3, 0xc8, 0x3e, 0x54, 0xe6, + 0x60, 0x3c, 0x77, 0xc8, 0xea, 0x14, 0x52, 0x58, 0xa6, 0x05, 0xa2, 0x26, 0x51, 0xf0, 0xf9, 0x47, + 0xb0, 0xa6, 0x96, 0x47, 0xb2, 0x04, 0x45, 0x19, 0x98, 0x5c, 0x1c, 0x7a, 0x91, 0x9f, 0xc0, 0xed, + 0x99, 0x3e, 0xcd, 0x14, 0xa5, 0xec, 0xd8, 0x9b, 0x89, 0xde, 0xe9, 0x35, 0x6c, 0xfe, 0x39, 0xa8, + 0x25, 0x04, 0xe5, 0x77, 0x37, 0xe5, 0xb3, 0x7e, 0x1e, 0x1a, 0x51, 0xdd, 0xcf, 0xb3, 0xf9, 0x3f, + 0x72, 0xc0, 0xe6, 0x65, 0xf5, 0x2f, 0xb3, 0x0b, 0xf3, 0x8c, 0x99, 0x4b, 0x61, 0xcc, 0xff, 0x67, + 0xfa, 0xc3, 0xfb, 0xb0, 0xec, 0xf3, 0x81, 0x77, 0xc1, 0x7d, 0x2d, 0xa2, 0x4a, 0x8b, 0xb3, 0x1e, + 0x21, 0x54, 0x2f, 0x3e, 0x9d, 0xcd, 0xec, 0x28, 0x25, 0x0e, 0x9c, 0x68, 0x0a, 0xd4, 0x4c, 0x82, + 0xc7, 0x31, 0x2c, 0xd8, 0xee, 0xe0, 0xdc, 0xf3, 0xa5, 0x1c, 0xfc, 0x95, 0x6f, 0xbd, 0x7d, 0x6e, + 0x35, 0xb1, 0x3c, 0x6a, 0x6d, 0xa6, 0xac, 0xcc, 0xf8, 0x08, 0x2a, 0x1a, 0x98, 0x95, 0xa1, 0x70, + 0xd0, 0x3e, 0xdc, 0xee, 0xd6, 0x6f, 0xb0, 0x1a, 0x94, 0xcd, 0xd6, 0x4e, 0xf7, 0x59, 0xcb, 0x6c, + 0xed, 0xd6, 0x33, 0xac, 0x04, 0xf9, 0x83, 0x6e, 0xaf, 0x5f, 0xcf, 0x1a, 0x9b, 0xd0, 0x90, 0x35, + 0xce, 0x07, 0x35, 0x7e, 0x2b, 0x1f, 0xb9, 0x0b, 0x11, 0x29, 0x4d, 0xf4, 0x1f, 0x42, 0x55, 0x57, + 0x6f, 0x24, 0x47, 0xcc, 0x04, 0xf5, 0x85, 0x71, 0xee, 0x69, 0xb2, 0x7a, 0x07, 0x28, 0xa4, 0x3b, + 0x8c, 0x8a, 0x65, 0x13, 0x7a, 0x6b, 0x4a, 0xf8, 0x10, 0x8d, 0x9f, 0x04, 0x1b, 0xfe, 0x7f, 0xb0, + 0x98, 0x74, 0xe0, 0x4b, 0x89, 0x94, 0x66, 0x70, 0x8a, 0xd2, 0x09, 0x8f, 0x3e, 0xfb, 0x09, 0xd4, + 0x67, 0x03, 0x00, 0x52, 0x79, 0xbe, 0xa6, 0xfc, 0x92, 0x93, 0x8c, 0x09, 0xb0, 0x7d, 0x58, 0x4d, + 0x53, 0xf0, 0x90, 0x3f, 0xae, 0x77, 0x52, 0xb0, 0x79, 0x25, 0x8e, 0x7d, 0x26, 0x03, 0x41, 0x05, + 0x9c, 0xfe, 0x77, 0x92, 0xed, 0x6b, 0x83, 0xbd, 0x45, 0xff, 0xb4, 0x90, 0xd0, 0x05, 0x40, 0x0c, + 0x63, 0x75, 0xa8, 0x76, 0x8f, 0x5a, 0x1d, 0x6b, 0x67, 0xbf, 0xd9, 0xe9, 0xb4, 0x0e, 0xea, 0x37, + 0x18, 0x83, 0x45, 0x0c, 0x66, 0xef, 0x46, 0xb0, 0x8c, 0x80, 0xc9, 0x80, 0x9c, 0x82, 0x65, 0xd9, + 0x2a, 0xd4, 0xdb, 0x9d, 0x19, 0x68, 0x8e, 0x35, 0x60, 0xf5, 0xa8, 0x45, 0xf1, 0xef, 0x44, 0xbd, + 0x79, 0x61, 0x34, 0xc8, 0xd7, 0x15, 0x46, 0xc3, 0x57, 0xf6, 0x68, 0xc4, 0x43, 0xb9, 0x0e, 0x94, + 0x2e, 0xfd, 0x77, 0x32, 0xb0, 0x36, 0x83, 0x88, 0xcf, 0x86, 0x90, 0x26, 0x9d, 0xd4, 0xa1, 0xab, + 0x08, 0x54, 0xab, 0xe9, 0x7d, 0x58, 0x8e, 0x1c, 0x4f, 0x33, 0xbb, 0x52, 0x3d, 0x42, 0x28, 0xe2, + 0x0f, 0x61, 0x45, 0xf3, 0x5f, 0xcd, 0xc8, 0x0a, 0xa6, 0xa1, 0x64, 0x01, 0x63, 0x23, 0xca, 0xc1, + 0x9f, 0xe9, 0xf5, 0x10, 0xd6, 0x67, 0x11, 0x71, 0x9c, 0x2c, 0xd9, 0x5f, 0xf5, 0xc8, 0x1e, 0xcc, + 0x30, 0x42, 0xb2, 0xb7, 0xfa, 0x84, 0xab, 0xe6, 0x7f, 0x77, 0x01, 0xd8, 0x97, 0x53, 0xee, 0x5f, + 0xe1, 0xd9, 0x8f, 0xe0, 0x55, 0x09, 0x8e, 0xca, 0xd3, 0x92, 0x7d, 0xad, 0xf3, 0x5d, 0x69, 0xe7, + 0xab, 0xf2, 0xaf, 0x3e, 0x5f, 0x55, 0x78, 0xd5, 0xf9, 0xaa, 0xb7, 0xa1, 0xe6, 0x9c, 0xb9, 0x9e, + 0x10, 0x85, 0x42, 0x13, 0x0e, 0x1a, 0x0b, 0x77, 0x73, 0xf7, 0xaa, 0x66, 0x55, 0x02, 0x85, 0x1e, + 0x1c, 0xb0, 0xc7, 0x31, 0x11, 0x1f, 0x9e, 0xe1, 0x19, 0x43, 0x5d, 0x08, 0xb6, 0x86, 0x67, 0x5c, + 0x3a, 0x96, 0xd0, 0xd2, 0x50, 0x85, 0x05, 0x3c, 0x60, 0xef, 0xc0, 0x62, 0xe0, 0x4d, 0x85, 0x61, + 0xa1, 0x86, 0x81, 0x02, 0x65, 0x55, 0x82, 0x1e, 0xa9, 0xb0, 0xe9, 0xca, 0x34, 0xe0, 0xd6, 0xd8, + 0x09, 0x02, 0xa1, 0x9e, 0x0d, 0x3c, 0x37, 0xf4, 0xbd, 0x91, 0x8c, 0x7d, 0x2d, 0x4f, 0x03, 0x7e, + 0x48, 0x98, 0x1d, 0x42, 0xb0, 0x8f, 0xe3, 0x2e, 0x4d, 0x6c, 0xc7, 0x0f, 0x1a, 0x80, 0x5d, 0x52, + 0x6f, 0x8a, 0xfa, 0xbb, 0xed, 0xf8, 0x51, 0x5f, 0xc4, 0x43, 0x30, 0x73, 0xee, 0xab, 0x32, 0x7b, + 0xee, 0xeb, 0xcf, 0xa4, 0x9f, 0xfb, 0xaa, 0x61, 0xd5, 0x0f, 0x64, 0xd5, 0xf3, 0x53, 0xfc, 0xad, + 0x8e, 0x7f, 0xcd, 0x1f, 0x67, 0x5b, 0xfc, 0x36, 0xc7, 0xd9, 0x96, 0xd2, 0x8e, 0xb3, 0x7d, 0x04, + 0x15, 0x3c, 0x68, 0x64, 0x9d, 0x3b, 0x42, 0x87, 0xa3, 0x58, 0x5e, 0x5d, 0x3f, 0x89, 0xb4, 0xef, + 0xb8, 0xa1, 0x09, 0xbe, 0xfa, 0x19, 0xcc, 0x9f, 0x2c, 0x5b, 0xfe, 0x25, 0x9e, 0x2c, 0x93, 0x07, + 0xa2, 0xb6, 0xa0, 0xa4, 0xe6, 0x89, 0x31, 0xc8, 0x9f, 0xfa, 0xde, 0x58, 0xc5, 0x38, 0xc4, 0x6f, + 0xb6, 0x08, 0xd9, 0xd0, 0x93, 0x85, 0xb3, 0xa1, 0x67, 0xfc, 0xff, 0x50, 0xd1, 0x58, 0x8d, 0xbd, + 0x45, 0x7e, 0x49, 0x61, 0x9b, 0x49, 0xdd, 0x92, 0x46, 0xb1, 0x2c, 0xa1, 0xed, 0xa1, 0x90, 0x37, + 0x43, 0xc7, 0xe7, 0x78, 0x06, 0xd4, 0xf2, 0xf9, 0x05, 0xf7, 0x03, 0x15, 0x73, 0xaa, 0x47, 0x08, + 0x93, 0xe0, 0xc6, 0x6f, 0xc0, 0x4a, 0x62, 0x6e, 0xa5, 0x88, 0x78, 0x07, 0x16, 0x70, 0xdc, 0x54, + 0xd2, 0x40, 0xf2, 0x84, 0x97, 0xc4, 0xe1, 0x79, 0x57, 0x0a, 0x97, 0x59, 0x13, 0xdf, 0x3b, 0xc1, + 0x46, 0x32, 0x66, 0x45, 0xc2, 0x8e, 0x7c, 0xef, 0xc4, 0xf8, 0xc3, 0x1c, 0xe4, 0xf6, 0xbd, 0x89, + 0x9e, 0xc4, 0x96, 0x99, 0x4b, 0x62, 0x93, 0x06, 0xa7, 0x15, 0x19, 0x94, 0x52, 0x67, 0xc7, 0x40, + 0x91, 0x32, 0x2a, 0xef, 0xc1, 0xa2, 0x90, 0x13, 0xa1, 0x27, 0x2c, 0xf6, 0x17, 0xb6, 0x4f, 0x0a, + 0x71, 0x8e, 0x16, 0x9f, 0x3d, 0x0e, 0xfb, 0xde, 0x1e, 0xc1, 0xd9, 0x2a, 0xe4, 0x22, 0xf3, 0x05, + 0xd1, 0xe2, 0x91, 0xad, 0xc3, 0x02, 0x66, 0x33, 0x5f, 0xc9, 0xa0, 0xb7, 0x7c, 0x62, 0x3f, 0x80, + 0x95, 0x64, 0xbd, 0x24, 0x8a, 0xa4, 0x6e, 0xa4, 0x57, 0x8c, 0x32, 0xe9, 0x26, 0x08, 0x39, 0x42, + 0x34, 0x32, 0xb9, 0xe6, 0x94, 0x73, 0x44, 0x69, 0x42, 0xaf, 0x94, 0x10, 0x7a, 0x77, 0xa0, 0x12, + 0x8e, 0x2e, 0xac, 0x89, 0x7d, 0x35, 0xf2, 0xec, 0xa1, 0x5c, 0xdf, 0x10, 0x8e, 0x2e, 0x8e, 0x08, + 0xc2, 0x3e, 0x04, 0x18, 0x4f, 0x26, 0x72, 0xed, 0x61, 0xf0, 0x23, 0x66, 0xe5, 0xc3, 0xa3, 0x23, + 0x62, 0x39, 0xb3, 0x3c, 0x9e, 0x4c, 0xe8, 0x27, 0xdb, 0x85, 0xc5, 0xd4, 0x73, 0x9a, 0xb7, 0x55, + 0xf2, 0xad, 0x37, 0xd9, 0x4a, 0x59, 0x9c, 0xb5, 0x81, 0x0e, 0xdb, 0xfc, 0x09, 0xb0, 0x3f, 0xe5, + 0x69, 0xc9, 0x3e, 0x94, 0xa3, 0xfe, 0xe9, 0x87, 0x0d, 0x31, 0x9d, 0xbe, 0x92, 0x38, 0x6c, 0xd8, + 0x1c, 0x0e, 0x7d, 0x21, 0x17, 0x69, 0xc3, 0x8c, 0x44, 0x3e, 0x68, 0x3b, 0x66, 0x93, 0xe4, 0xbe, + 0xf1, 0x5f, 0x33, 0x50, 0xa0, 0x93, 0x8f, 0xef, 0xc2, 0x12, 0xd1, 0x47, 0x09, 0x81, 0x32, 0x54, + 0x4e, 0xfb, 0x6e, 0x5f, 0xe6, 0x02, 0x8a, 0x65, 0xa1, 0x9d, 0x06, 0xcf, 0x46, 0x33, 0xaf, 0x9d, + 0x08, 0xbf, 0x03, 0xe5, 0xa8, 0x69, 0x8d, 0x75, 0x4a, 0xaa, 0x65, 0xf6, 0x26, 0xe4, 0xcf, 0xbd, + 0x89, 0xf2, 0xfc, 0x40, 0x3c, 0x92, 0x26, 0xc2, 0xe3, 0xbe, 0x88, 0x36, 0xa8, 0xf3, 0xd2, 0x63, + 0x11, 0x35, 0x82, 0x6c, 0x30, 0xff, 0x8e, 0x0b, 0x29, 0xef, 0x78, 0x0c, 0x4b, 0x42, 0x0e, 0x68, + 0x39, 0x2d, 0xd7, 0x6f, 0x9a, 0xdf, 0x17, 0x1a, 0xde, 0x60, 0x34, 0x1d, 0x72, 0xdd, 0xf7, 0x86, + 0x09, 0x70, 0x12, 0xae, 0x34, 0x6b, 0xe3, 0x77, 0x33, 0x24, 0x5f, 0x44, 0xbd, 0xec, 0x1e, 0xe4, + 0xc5, 0xfe, 0x36, 0xe3, 0x89, 0x8f, 0xce, 0x35, 0x08, 0x3a, 0x13, 0x29, 0xc4, 0xd4, 0x61, 0xd4, + 0x5e, 0xaf, 0xbd, 0x66, 0x56, 0xdc, 0xe9, 0x38, 0x72, 0x5d, 0x7d, 0x4f, 0xbd, 0xd6, 0x8c, 0xdb, + 0x87, 0xde, 0x3e, 0x5a, 0xa6, 0x5b, 0x5a, 0x26, 0x5d, 0x3e, 0xb1, 0x63, 0x2a, 0x2d, 0x70, 0x78, + 0xc6, 0xb5, 0x0c, 0xba, 0xdf, 0xcb, 0x42, 0x2d, 0xd1, 0x23, 0x4c, 0x25, 0x14, 0x1b, 0x00, 0x05, + 0x96, 0xe4, 0x7c, 0x83, 0x00, 0x49, 0x45, 0x5d, 0x1b, 0xa7, 0x6c, 0x62, 0x9c, 0xa2, 0xe4, 0x9c, + 0x9c, 0x9e, 0x9c, 0xf3, 0x00, 0xca, 0xf1, 0x2d, 0x00, 0xc9, 0x2e, 0x89, 0xf6, 0xd4, 0xe9, 0x8e, + 0x98, 0x28, 0x4e, 0xe7, 0x29, 0xe8, 0xe9, 0x3c, 0x5f, 0x68, 0xd9, 0x1f, 0x0b, 0x58, 0x8d, 0x91, + 0x36, 0xa2, 0xbf, 0x94, 0xdc, 0x0f, 0xe3, 0x31, 0x54, 0xb4, 0xce, 0xeb, 0x59, 0x1e, 0x99, 0x44, + 0x96, 0x47, 0x74, 0x3a, 0x2b, 0x1b, 0x9f, 0xce, 0x32, 0xfe, 0x52, 0x16, 0x6a, 0x62, 0x7d, 0x39, + 0xee, 0xd9, 0x91, 0x37, 0x72, 0x06, 0x18, 0x68, 0x8a, 0x56, 0x98, 0x54, 0xb4, 0xd4, 0x3a, 0x93, + 0x4b, 0x8c, 0xf4, 0x2c, 0xfd, 0x68, 0x2a, 0x09, 0xe9, 0xe8, 0x68, 0xaa, 0x01, 0x35, 0x21, 0x18, + 0x31, 0x64, 0x14, 0xdf, 0x25, 0x60, 0x56, 0x4e, 0x39, 0xdf, 0xb6, 0x03, 0x92, 0x90, 0x3f, 0x80, + 0x15, 0x41, 0x83, 0xa7, 0xf2, 0xc6, 0xce, 0x68, 0xe4, 0x10, 0x25, 0x39, 0x9a, 0xea, 0xa7, 0x9c, + 0x9b, 0x76, 0xc8, 0x0f, 0x05, 0x42, 0x5e, 0x3d, 0x50, 0x1a, 0x3a, 0x81, 0x7d, 0x12, 0x27, 0x7c, + 0x46, 0xcf, 0x18, 0x59, 0xb6, 0x2f, 0xb5, 0xc8, 0x32, 0x39, 0x20, 0x2a, 0x63, 0xfb, 0x32, 0x8a, + 0x2c, 0xcf, 0x70, 0x52, 0x71, 0x96, 0x93, 0x8c, 0x7f, 0x9d, 0x85, 0x8a, 0xc6, 0x96, 0xaf, 0xb3, + 0xbb, 0xde, 0x9e, 0x0b, 0x0c, 0x96, 0xf5, 0x18, 0xe0, 0xdb, 0xc9, 0x26, 0x31, 0xf7, 0x85, 0x2e, + 0x39, 0xd0, 0x18, 0xf8, 0x16, 0x94, 0xc5, 0xaa, 0xfb, 0x08, 0x5d, 0xb0, 0xf2, 0xea, 0x0f, 0x04, + 0x1c, 0x4d, 0x4f, 0x14, 0xf2, 0x21, 0x22, 0x0b, 0x31, 0xf2, 0xa1, 0x40, 0xbe, 0x2c, 0x05, 0xfb, + 0x53, 0xa8, 0xca, 0x5a, 0x71, 0x4e, 0xf1, 0x75, 0xe3, 0x55, 0x9f, 0x98, 0x6f, 0xb3, 0x42, 0xcd, + 0xd1, 0xe4, 0xcb, 0x82, 0x0f, 0x55, 0xc1, 0xd2, 0xab, 0x0a, 0x3e, 0xa4, 0x07, 0x63, 0x2f, 0xca, + 0x6a, 0xc7, 0xbc, 0x2b, 0x25, 0xc7, 0x3e, 0x84, 0x15, 0x25, 0xae, 0xa6, 0xae, 0xed, 0xba, 0xde, + 0xd4, 0x1d, 0x70, 0x75, 0x40, 0x8b, 0x49, 0xd4, 0x71, 0x8c, 0x31, 0x86, 0xd1, 0x69, 0x5f, 0xca, + 0xdf, 0xba, 0x0f, 0x05, 0xd2, 0xcb, 0x49, 0xf9, 0x48, 0x17, 0x5c, 0x44, 0xc2, 0xee, 0x41, 0x81, + 0xd4, 0xf3, 0xec, 0xb5, 0xc2, 0x86, 0x08, 0x8c, 0x26, 0x30, 0x51, 0xf0, 0x90, 0x87, 0xbe, 0x33, + 0x08, 0xe2, 0xb3, 0x5f, 0x05, 0x61, 0x7f, 0x52, 0x5b, 0xb1, 0xe7, 0x36, 0xa6, 0x44, 0x1b, 0x95, + 0x68, 0xc4, 0xc6, 0xb4, 0x92, 0xa8, 0x43, 0xaa, 0x4b, 0x23, 0x58, 0x3f, 0xe1, 0xe1, 0x0b, 0xce, + 0x5d, 0x57, 0x28, 0x43, 0x03, 0xee, 0x86, 0xbe, 0x3d, 0x12, 0x93, 0x44, 0x6f, 0xf0, 0x68, 0xae, + 0xd6, 0xd8, 0x07, 0xb2, 0x1d, 0x17, 0xdc, 0x89, 0xca, 0x91, 0xec, 0x58, 0x3b, 0x49, 0xc3, 0x6d, + 0xfe, 0x3a, 0x6c, 0x5e, 0x5f, 0x28, 0xe5, 0xdc, 0xe7, 0xbd, 0xa4, 0x54, 0x89, 0xe2, 0x80, 0x23, + 0xcf, 0x0e, 0xa9, 0x37, 0xba, 0x64, 0xe9, 0x40, 0x45, 0xc3, 0xc4, 0x7b, 0x7f, 0x06, 0x95, 0x3b, + 0x7a, 0x10, 0x3b, 0x92, 0xeb, 0xf9, 0x63, 0x8c, 0xbb, 0x0d, 0xad, 0xb8, 0xf6, 0x8c, 0xb9, 0x14, + 0xc3, 0xf1, 0xf8, 0xbb, 0xb1, 0x05, 0x4b, 0xa8, 0xd9, 0x6b, 0x1b, 0xdd, 0xcb, 0x94, 0x41, 0x63, + 0x15, 0x58, 0x87, 0x64, 0x97, 0x9e, 0xef, 0xf9, 0x9f, 0x72, 0x50, 0xd1, 0xc0, 0x62, 0x37, 0xc2, + 0x04, 0x40, 0x6b, 0xe8, 0xd8, 0x63, 0xae, 0x82, 0x9c, 0x35, 0xb3, 0x86, 0xd0, 0x5d, 0x09, 0x14, + 0x7b, 0xb1, 0x7d, 0x71, 0x66, 0x79, 0xd3, 0xd0, 0x1a, 0xf2, 0x33, 0x9f, 0xab, 0x5e, 0x56, 0xed, + 0x8b, 0xb3, 0xee, 0x34, 0xdc, 0x45, 0x98, 0xa0, 0x12, 0xb2, 0x44, 0xa3, 0x92, 0x39, 0x6b, 0x63, + 0xfb, 0x32, 0xa6, 0x92, 0x89, 0x93, 0xc4, 0x99, 0xf9, 0x28, 0x71, 0x92, 0xac, 0xc5, 0xd9, 0x0d, + 0xb4, 0x30, 0xbf, 0x81, 0x7e, 0x0c, 0xeb, 0xb4, 0x81, 0x4a, 0xd1, 0x6c, 0xcd, 0xac, 0xe4, 0x55, + 0xc4, 0xca, 0x97, 0xd4, 0xd4, 0xde, 0xba, 0x78, 0x03, 0x25, 0x96, 0x02, 0xe7, 0x67, 0x24, 0xc8, + 0x32, 0xa6, 0x78, 0x33, 0x59, 0x79, 0xcf, 0xf9, 0x19, 0x17, 0x94, 0x98, 0x1d, 0xa3, 0x53, 0xca, + 0x03, 0x16, 0x63, 0xc7, 0x9d, 0xa5, 0xb4, 0x2f, 0x93, 0x94, 0x65, 0x49, 0x69, 0x5f, 0xea, 0x94, + 0x8f, 0x60, 0x63, 0xcc, 0x87, 0x8e, 0x9d, 0xac, 0xd6, 0x8a, 0x15, 0xb7, 0x55, 0x42, 0x6b, 0x65, + 0x7a, 0x64, 0xb8, 0x8b, 0xd1, 0xf8, 0x99, 0x37, 0x3e, 0x71, 0x48, 0x67, 0xa1, 0x7c, 0x9d, 0xbc, + 0xb9, 0xe8, 0x4e, 0xc7, 0xbf, 0x86, 0x60, 0x51, 0x24, 0x30, 0x6a, 0x50, 0xe9, 0x85, 0xde, 0x44, + 0x4d, 0xf3, 0x22, 0x54, 0xe9, 0x51, 0x9e, 0x7a, 0xbc, 0x05, 0x37, 0x51, 0x24, 0xf4, 0xbd, 0x89, + 0x37, 0xf2, 0xce, 0xae, 0x12, 0x7e, 0xbc, 0x7f, 0x97, 0x81, 0x95, 0x04, 0x56, 0x8a, 0xd7, 0x8f, + 0x49, 0x9e, 0x45, 0x47, 0xd7, 0x68, 0x0d, 0x2e, 0x6b, 0x6b, 0x90, 0x08, 0x49, 0x98, 0xa9, 0xe3, + 0x6c, 0xcd, 0xf8, 0x7a, 0x06, 0x55, 0x90, 0x44, 0x4a, 0x63, 0x5e, 0xa4, 0xc8, 0xf2, 0xea, 0xe2, + 0x06, 0x55, 0xc5, 0xaf, 0xc8, 0x43, 0x30, 0x43, 0xf9, 0xca, 0xb9, 0xe4, 0x49, 0x02, 0xdd, 0xe7, + 0xa7, 0x7a, 0x10, 0x3b, 0x02, 0x03, 0xe3, 0x1f, 0x65, 0x00, 0xe2, 0xde, 0xe1, 0x59, 0x86, 0x48, + 0x6f, 0xc9, 0x60, 0x1a, 0xaa, 0xa6, 0xa3, 0xbc, 0x05, 0xd5, 0x28, 0x63, 0x39, 0xd6, 0x84, 0x2a, + 0x0a, 0x26, 0xd4, 0xa1, 0xf7, 0x60, 0xe9, 0x6c, 0xe4, 0x9d, 0xa0, 0xc6, 0x2a, 0xf5, 0x16, 0xca, + 0x57, 0x5b, 0x24, 0xb0, 0xd2, 0x46, 0x62, 0xbd, 0x29, 0x9f, 0x9a, 0xd4, 0xac, 0x6b, 0x41, 0xc6, + 0xdf, 0xc8, 0x46, 0xa9, 0x9b, 0xf1, 0x48, 0xbc, 0xdc, 0xbc, 0xfb, 0x45, 0x72, 0x69, 0x5e, 0x16, + 0x5e, 0x7c, 0x0c, 0x8b, 0x3e, 0x6d, 0x4a, 0x6a, 0xc7, 0xca, 0xbf, 0x64, 0xc7, 0xaa, 0xf9, 0x09, + 0x4d, 0xe7, 0xfb, 0x50, 0xb7, 0x87, 0x17, 0xdc, 0x0f, 0x1d, 0xf4, 0xd6, 0xa3, 0x7e, 0x2c, 0x93, + 0x25, 0x35, 0x38, 0x2a, 0xa2, 0xef, 0xc1, 0x92, 0x3c, 0x89, 0x1b, 0x51, 0xca, 0x7b, 0x80, 0x62, + 0xb0, 0x20, 0x34, 0xfe, 0xa9, 0xca, 0x15, 0x4d, 0xce, 0xee, 0xcb, 0x47, 0x45, 0x7f, 0xc3, 0xec, + 0x7c, 0x00, 0x55, 0x32, 0x92, 0x0c, 0x02, 0x48, 0x79, 0x44, 0x40, 0x19, 0x02, 0x48, 0x0e, 0x6b, + 0xfe, 0x75, 0x86, 0xd5, 0xf8, 0xf7, 0x19, 0x28, 0xee, 0x7b, 0x93, 0x7d, 0x87, 0xb2, 0xf9, 0x71, + 0x99, 0x44, 0x31, 0xaa, 0x05, 0xf1, 0x88, 0x89, 0x3f, 0x2f, 0x39, 0x70, 0x96, 0xaa, 0xe6, 0xd5, + 0x92, 0x6a, 0xde, 0x17, 0x70, 0x0b, 0x43, 0x80, 0xbe, 0x37, 0xf1, 0x7c, 0xb1, 0x54, 0xed, 0x11, + 0xa9, 0x7b, 0x9e, 0x1b, 0x9e, 0x2b, 0xd9, 0x79, 0xf3, 0x94, 0xf3, 0x23, 0x8d, 0xe2, 0x30, 0x22, + 0xc0, 0x23, 0x9d, 0xa3, 0xf0, 0xc2, 0x22, 0x0b, 0x5d, 0xea, 0xa3, 0x24, 0x51, 0x97, 0x04, 0xa2, + 0x85, 0x70, 0xd4, 0x48, 0x8d, 0xcf, 0xa0, 0x1c, 0x39, 0x7b, 0xd8, 0xfb, 0x50, 0x3e, 0xf7, 0x26, + 0xd2, 0x23, 0x94, 0x49, 0x1c, 0xca, 0x93, 0x6f, 0x6d, 0x96, 0xce, 0xe9, 0x47, 0x60, 0xfc, 0x61, + 0x11, 0x8a, 0x6d, 0xf7, 0xc2, 0x73, 0x06, 0x98, 0x6d, 0x3a, 0xe6, 0x63, 0x4f, 0x5d, 0x07, 0x20, + 0x7e, 0x63, 0x6e, 0x56, 0x7c, 0x9b, 0x4f, 0x4e, 0xe6, 0x66, 0x45, 0xf7, 0xf8, 0xac, 0xc1, 0x82, + 0xaf, 0x5f, 0xc7, 0x53, 0xf0, 0x31, 0xff, 0x3d, 0xda, 0x2f, 0x0b, 0xda, 0x25, 0x0b, 0xa2, 0x2e, + 0xba, 0x26, 0x06, 0x87, 0x8c, 0x8e, 0x67, 0x96, 0x11, 0x82, 0x03, 0xf6, 0x06, 0x14, 0xe5, 0x19, + 0x38, 0x3a, 0xb4, 0x44, 0x09, 0xeb, 0x12, 0x84, 0xdc, 0xe0, 0x73, 0x0a, 0xe1, 0x46, 0x8a, 0x6c, + 0xce, 0xac, 0x2a, 0xe0, 0xae, 0xe0, 0xb5, 0x3b, 0x50, 0x21, 0x7a, 0x22, 0x29, 0xc9, 0x24, 0x4d, + 0x04, 0x21, 0x41, 0xca, 0xad, 0x56, 0xe5, 0xd4, 0x5b, 0xad, 0x30, 0x9d, 0x38, 0x92, 0xb2, 0xf4, + 0x8a, 0x40, 0x77, 0x19, 0x69, 0x70, 0x75, 0x55, 0x9c, 0xf4, 0xa9, 0xd0, 0x69, 0x65, 0xe5, 0x53, + 0x79, 0x1b, 0x6a, 0xa7, 0xf6, 0x68, 0x74, 0x62, 0x0f, 0x9e, 0x93, 0x2b, 0xa0, 0x4a, 0xde, 0x4f, + 0x05, 0x44, 0x5f, 0xc0, 0x1d, 0xa8, 0x68, 0xb3, 0x8c, 0x19, 0x98, 0x79, 0x13, 0xe2, 0xf9, 0x9d, + 0xf5, 0xf0, 0x2d, 0xbe, 0x86, 0x87, 0x4f, 0xcb, 0x44, 0x5d, 0x4a, 0x66, 0xa2, 0xde, 0x42, 0x69, + 0x2a, 0x53, 0x0e, 0xeb, 0x74, 0x71, 0x8e, 0x3d, 0x1c, 0x62, 0xca, 0x21, 0x3a, 0xb2, 0x68, 0xf0, + 0x08, 0xbf, 0x4c, 0xb6, 0x04, 0xc1, 0x88, 0xe4, 0x36, 0xb9, 0xa9, 0x27, 0xb6, 0x33, 0xc4, 0x43, + 0x07, 0xe4, 0x3d, 0x28, 0xda, 0xe3, 0xf0, 0xc8, 0x76, 0x86, 0xec, 0x2e, 0x54, 0x15, 0x1a, 0x77, + 0xc7, 0x15, 0x1a, 0x7f, 0x89, 0x16, 0x7b, 0xa2, 0x01, 0xb5, 0x88, 0x62, 0x1c, 0x1f, 0x39, 0xae, + 0x48, 0x12, 0xe4, 0x83, 0x8f, 0x30, 0xcb, 0x27, 0xe4, 0x78, 0xb0, 0x78, 0xf1, 0xe1, 0xad, 0x28, + 0xf9, 0x00, 0xb9, 0x54, 0xfd, 0xa7, 0xe0, 0x18, 0x51, 0x0a, 0xe5, 0x8e, 0x62, 0x74, 0xeb, 0x09, + 0xfd, 0x57, 0x92, 0x62, 0x8c, 0x8e, 0x08, 0xd8, 0x67, 0x9a, 0xfd, 0xda, 0x40, 0xe2, 0x37, 0x66, + 0xea, 0xbf, 0xee, 0x50, 0xd6, 0x6d, 0x00, 0x27, 0x10, 0xbb, 0x4c, 0xc0, 0xdd, 0x21, 0x9e, 0x11, + 0x2e, 0x99, 0x65, 0x27, 0x78, 0x4a, 0x80, 0xef, 0xd6, 0xb0, 0x6d, 0x42, 0x55, 0x7f, 0x4d, 0x56, + 0x82, 0x7c, 0xf7, 0xa8, 0xd5, 0xa9, 0xdf, 0x60, 0x15, 0x28, 0xf6, 0x5a, 0xfd, 0xfe, 0x01, 0x46, + 0xfa, 0xaa, 0x50, 0x8a, 0x0e, 0x32, 0x66, 0xc5, 0x53, 0x73, 0x67, 0xa7, 0x75, 0xd4, 0x6f, 0xed, + 0xd6, 0x73, 0x3f, 0xcd, 0x97, 0xb2, 0xf5, 0x9c, 0xf1, 0x47, 0x39, 0xa8, 0x68, 0xa3, 0xf0, 0x72, + 0x61, 0x7c, 0x1b, 0x00, 0x2d, 0xc9, 0x38, 0x23, 0x35, 0x6f, 0x96, 0x05, 0x84, 0x26, 0x5f, 0x8f, + 0x51, 0xe4, 0xe8, 0x46, 0x26, 0x15, 0xa3, 0x78, 0x1b, 0x6a, 0x74, 0xb9, 0x91, 0x1e, 0xaf, 0x2d, + 0x98, 0x55, 0x02, 0x4a, 0x51, 0x8d, 0x27, 0x9c, 0x91, 0x08, 0x8f, 0xd7, 0xc9, 0x4b, 0x4d, 0x08, + 0x84, 0x07, 0xec, 0xf0, 0x74, 0x64, 0xe0, 0x8d, 0x2e, 0x38, 0x51, 0x90, 0x46, 0x58, 0x91, 0xb0, + 0xbe, 0x3c, 0xab, 0x2d, 0xe5, 0xa1, 0x76, 0xc4, 0xb6, 0x60, 0x56, 0x09, 0x28, 0x1b, 0xfa, 0x81, + 0x62, 0x20, 0xca, 0x5e, 0xd9, 0x98, 0xe7, 0x86, 0x04, 0xf3, 0x1c, 0xcc, 0xb9, 0x11, 0xcb, 0xc8, + 0x18, 0xdf, 0x9b, 0x2f, 0xf7, 0x6a, 0x77, 0x22, 0x7b, 0x1f, 0xd8, 0x78, 0x32, 0xb1, 0x52, 0x1c, + 0x7c, 0x79, 0x73, 0x69, 0x3c, 0x99, 0xf4, 0x35, 0xff, 0xd7, 0x77, 0xe0, 0x7b, 0xfc, 0x06, 0x58, + 0x53, 0x2c, 0x60, 0xec, 0x62, 0x64, 0x8a, 0xc5, 0x62, 0x39, 0xa3, 0x8b, 0xe5, 0x14, 0xe9, 0x97, + 0x4d, 0x95, 0x7e, 0x2f, 0x93, 0x13, 0xc6, 0x1e, 0x54, 0x8e, 0xb4, 0xab, 0xd3, 0xee, 0x8a, 0x1d, + 0x42, 0x5d, 0x9a, 0x46, 0x7b, 0x07, 0xf9, 0x14, 0x7d, 0x79, 0x57, 0x9a, 0xd6, 0x9b, 0xac, 0xd6, + 0x1b, 0xe3, 0x1f, 0x64, 0xe8, 0xaa, 0x99, 0xa8, 0xf3, 0xf1, 0x6d, 0x6d, 0x2a, 0xfc, 0x16, 0x9f, + 0x84, 0xaf, 0xa8, 0xb0, 0x9b, 0x3c, 0xc4, 0x8e, 0x5d, 0xb3, 0xbc, 0xd3, 0xd3, 0x80, 0xab, 0x1c, + 0x8f, 0x0a, 0xc2, 0xba, 0x08, 0x52, 0xca, 0xb7, 0xd0, 0xf0, 0x1d, 0xaa, 0x3f, 0x90, 0x89, 0x1d, + 0x42, 0xf9, 0x3e, 0xb4, 0x2f, 0x65, 0xab, 0x81, 0x50, 0x41, 0x64, 0x7c, 0x40, 0x1d, 0x96, 0x8d, + 0x9e, 0x8d, 0xbf, 0x2b, 0x0f, 0xeb, 0xcf, 0x8e, 0xef, 0x7d, 0x28, 0x45, 0xb5, 0x26, 0x77, 0x58, + 0x45, 0x19, 0xe1, 0xc5, 0x3e, 0x8e, 0xce, 0x90, 0x44, 0x8f, 0x69, 0x71, 0x61, 0x8c, 0xa7, 0xad, + 0xf5, 0xfa, 0x03, 0x60, 0xa7, 0x8e, 0x3f, 0x4b, 0x4c, 0x8b, 0xad, 0x8e, 0x18, 0x8d, 0xda, 0x38, + 0x86, 0x15, 0x25, 0x25, 0x34, 0x8b, 0x20, 0x39, 0x79, 0x99, 0x57, 0x08, 0xf9, 0xec, 0x9c, 0x90, + 0x37, 0x7e, 0xb3, 0x00, 0x45, 0x75, 0x0d, 0x61, 0xda, 0xd5, 0x79, 0xe5, 0xe4, 0xd5, 0x79, 0x8d, + 0xc4, 0x85, 0x4a, 0x38, 0xf5, 0x72, 0xbf, 0x7f, 0x6f, 0x76, 0xcb, 0xd6, 0x62, 0x15, 0x89, 0x6d, + 0x5b, 0xc6, 0x2a, 0x0a, 0xc9, 0x58, 0x45, 0xda, 0x75, 0x82, 0xa4, 0x7a, 0xce, 0x5d, 0x27, 0x78, + 0x0b, 0x48, 0x8f, 0xd0, 0x92, 0xdb, 0x4a, 0x08, 0x10, 0x7b, 0x4e, 0x52, 0xed, 0x28, 0xcd, 0xaa, + 0x1d, 0xaf, 0xad, 0x12, 0x7c, 0x0c, 0x0b, 0x74, 0xbd, 0x86, 0x3c, 0xfc, 0xab, 0x36, 0x0e, 0x39, + 0x56, 0xea, 0x3f, 0x9d, 0x78, 0x30, 0x25, 0xad, 0x7e, 0x37, 0x57, 0x25, 0x71, 0x37, 0x97, 0x1e, + 0x43, 0xa9, 0x26, 0x63, 0x28, 0xf7, 0xa0, 0x1e, 0x0d, 0x1c, 0x7a, 0x24, 0xdd, 0x40, 0x9e, 0x1c, + 0x5c, 0x54, 0x70, 0x21, 0x0d, 0x3b, 0x41, 0xbc, 0xf1, 0x2d, 0x26, 0x36, 0x3e, 0x21, 0xab, 0x9a, + 0x61, 0xc8, 0xc7, 0x93, 0x50, 0x6d, 0x7c, 0xda, 0x0d, 0x8e, 0x34, 0xf3, 0x4b, 0x38, 0xf3, 0x6a, + 0x7a, 0x89, 0x3b, 0xb6, 0x61, 0xf1, 0xd4, 0x76, 0x46, 0x53, 0x9f, 0x5b, 0x3e, 0xb7, 0x03, 0xcf, + 0xc5, 0xc5, 0x1f, 0xef, 0xc1, 0xf2, 0x15, 0xf7, 0x88, 0xc6, 0x44, 0x12, 0xb3, 0x76, 0xaa, 0x3f, + 0xe2, 0x21, 0x26, 0x7d, 0x24, 0xc4, 0x96, 0x25, 0xcf, 0x10, 0x53, 0xae, 0x4a, 0xbb, 0x63, 0xed, + 0x1d, 0xb4, 0x9f, 0xec, 0xf7, 0xeb, 0x19, 0xf1, 0xd8, 0x3b, 0xde, 0xd9, 0x69, 0xb5, 0x76, 0x71, + 0x0b, 0x03, 0x58, 0xd8, 0x6b, 0xb6, 0x0f, 0xe4, 0x06, 0x96, 0xaf, 0x17, 0x8c, 0x7f, 0x99, 0x85, + 0x8a, 0xf6, 0x36, 0xec, 0x51, 0x34, 0x09, 0x74, 0x03, 0xd4, 0xed, 0xf9, 0x37, 0xde, 0x52, 0x12, + 0x5e, 0x9b, 0x85, 0xe8, 0xae, 0xc6, 0xec, 0xb5, 0x77, 0x35, 0xb2, 0x77, 0x61, 0xc9, 0xa6, 0x1a, + 0xa2, 0x41, 0x97, 0xce, 0x7d, 0x09, 0x96, 0x63, 0x8e, 0x19, 0xa4, 0xf1, 0x36, 0x25, 0xe8, 0xf2, + 0x2a, 0x69, 0x33, 0xda, 0xa9, 0x70, 0x6e, 0x8a, 0x72, 0x64, 0x64, 0x30, 0x3e, 0xda, 0xf0, 0xe5, + 0x78, 0x29, 0xb4, 0x10, 0x41, 0x09, 0x0e, 0xaf, 0x9a, 0xd1, 0xb3, 0xf1, 0x09, 0x40, 0xfc, 0x3e, + 0xc9, 0xe1, 0xbb, 0x91, 0x1c, 0xbe, 0x8c, 0x36, 0x7c, 0x59, 0xe3, 0x9f, 0x48, 0xd1, 0x25, 0xe7, + 0x22, 0x72, 0xf5, 0xfd, 0x00, 0x94, 0xf3, 0xd1, 0xc2, 0x24, 0xef, 0xc9, 0x88, 0x87, 0xea, 0x32, + 0x83, 0x65, 0x89, 0x69, 0x47, 0x88, 0x39, 0x51, 0x9b, 0x9d, 0x17, 0xb5, 0x6f, 0x41, 0x55, 0x88, + 0x59, 0xc9, 0x48, 0x81, 0x14, 0x57, 0x95, 0xb1, 0x7d, 0xa9, 0xda, 0x4e, 0xc8, 0xd8, 0xfc, 0x8c, + 0x8c, 0xfd, 0x7b, 0x19, 0xba, 0x5b, 0x24, 0xee, 0x68, 0x2c, 0x64, 0xa3, 0x3a, 0x93, 0x42, 0x56, + 0x92, 0x9a, 0x11, 0xfe, 0x1a, 0xc1, 0x99, 0x4d, 0x17, 0x9c, 0xe9, 0x22, 0x39, 0x97, 0x2a, 0x92, + 0x8d, 0x4d, 0x68, 0xec, 0x72, 0x31, 0x14, 0xcd, 0xd1, 0x68, 0x66, 0x2c, 0x8d, 0x5b, 0x70, 0x33, + 0x05, 0x27, 0xbd, 0x36, 0x5f, 0xc2, 0x5a, 0x93, 0x2e, 0x5d, 0xf8, 0xae, 0x0e, 0x4f, 0x1a, 0x0d, + 0x58, 0x9f, 0xad, 0x52, 0x36, 0xb6, 0x07, 0xcb, 0xbb, 0xfc, 0x64, 0x7a, 0x76, 0xc0, 0x2f, 0xe2, + 0x86, 0x18, 0xe4, 0x83, 0x73, 0xef, 0x85, 0x9c, 0x5c, 0xfc, 0x8d, 0x69, 0x99, 0x82, 0xc6, 0x0a, + 0x26, 0x7c, 0xa0, 0x3c, 0xf7, 0x08, 0xe9, 0x4d, 0xf8, 0xc0, 0x78, 0x04, 0x4c, 0xaf, 0x47, 0xce, + 0x84, 0x30, 0xab, 0xa6, 0x27, 0x56, 0x70, 0x15, 0x84, 0x7c, 0xac, 0x0e, 0x0d, 0x42, 0x30, 0x3d, + 0xe9, 0x11, 0xc4, 0x78, 0x0f, 0xaa, 0x47, 0xf6, 0x95, 0xc9, 0xbf, 0x91, 0x67, 0xf3, 0x36, 0xa0, + 0x38, 0xb1, 0xaf, 0x84, 0x3c, 0x8d, 0x82, 0x78, 0x88, 0x36, 0xfe, 0x59, 0x1e, 0x16, 0x88, 0x92, + 0xdd, 0xa5, 0x9b, 0x90, 0x1d, 0x17, 0xe5, 0x99, 0xda, 0x59, 0x34, 0xd0, 0xdc, 0xe6, 0x93, 0x9d, + 0xdf, 0x7c, 0xa4, 0xc7, 0x51, 0xdd, 0xea, 0xa4, 0xc2, 0x2d, 0xee, 0x74, 0xac, 0xae, 0x72, 0x4a, + 0xde, 0x3c, 0x90, 0x8f, 0x6f, 0xd0, 0xa6, 0x53, 0xd7, 0xc9, 0x80, 0x78, 0x6c, 0xbc, 0x51, 0xef, + 0xd4, 0x9e, 0x2a, 0xf7, 0x1d, 0x1d, 0x94, 0x6a, 0x21, 0x16, 0xd5, 0x81, 0xd3, 0xa4, 0x85, 0x38, + 0x67, 0x09, 0x96, 0x5e, 0x6d, 0x09, 0x92, 0x2b, 0xf2, 0x25, 0x96, 0x20, 0xbc, 0x86, 0x25, 0xf8, + 0x1a, 0xc1, 0xe8, 0x9b, 0x50, 0x42, 0x45, 0x49, 0xdb, 0x86, 0x84, 0x82, 0x24, 0xb6, 0xa1, 0x4f, + 0x35, 0x5b, 0x89, 0x32, 0x61, 0xb4, 0x7d, 0xc0, 0xe4, 0xdf, 0xfc, 0x72, 0x82, 0x7c, 0x5f, 0x43, + 0x51, 0x42, 0x05, 0x43, 0xbb, 0xf6, 0x58, 0x5d, 0x8c, 0x87, 0xbf, 0xc5, 0xb0, 0xe1, 0x6d, 0x5e, + 0xdf, 0x4c, 0x1d, 0x9f, 0x0f, 0xd5, 0x8d, 0x47, 0x0e, 0xae, 0x51, 0x01, 0x11, 0x2f, 0x28, 0xec, + 0x36, 0xd7, 0x7b, 0xe1, 0x4a, 0xd9, 0x53, 0x74, 0x82, 0xa7, 0xe2, 0xd1, 0x60, 0x50, 0xc7, 0x6b, + 0x34, 0x27, 0x9e, 0xaf, 0x76, 0x79, 0xe3, 0xe7, 0x19, 0xa8, 0xcb, 0xd5, 0x15, 0xe1, 0x74, 0xb3, + 0xa9, 0x70, 0x5d, 0xe2, 0xc6, 0xcb, 0xef, 0x2f, 0x32, 0xa0, 0x86, 0xde, 0xa2, 0x68, 0xcb, 0x27, + 0x6f, 0x57, 0x45, 0x00, 0xf7, 0xe4, 0xb6, 0xff, 0x26, 0x54, 0x54, 0xd2, 0xf8, 0xd8, 0x19, 0xa9, + 0xcb, 0xf2, 0x29, 0x6b, 0xfc, 0xd0, 0x19, 0x29, 0x8d, 0xc1, 0xb7, 0xe5, 0x01, 0xe8, 0x0c, 0x6a, + 0x0c, 0xa6, 0x1d, 0x72, 0xe3, 0x5f, 0x64, 0x60, 0x59, 0x7b, 0x15, 0xb9, 0x6e, 0x7f, 0x04, 0xd5, + 0xe8, 0xfe, 0x5a, 0x1e, 0xa9, 0xaa, 0x1b, 0x49, 0x41, 0x13, 0x17, 0xab, 0x0c, 0x22, 0x48, 0x20, + 0x3a, 0x33, 0xb4, 0xaf, 0x28, 0xb3, 0x79, 0x3a, 0x56, 0xd6, 0xe0, 0xd0, 0xbe, 0xda, 0xe3, 0xbc, + 0x37, 0x1d, 0x0b, 0x5b, 0xff, 0x05, 0xe7, 0xcf, 0x23, 0x02, 0x12, 0x9f, 0x20, 0x60, 0x92, 0xc2, + 0x80, 0xda, 0xd8, 0x73, 0xc3, 0xf3, 0x88, 0x44, 0xaa, 0xe9, 0x08, 0x24, 0x1a, 0xe3, 0x0f, 0xb2, + 0xb0, 0x42, 0x3e, 0x49, 0xe9, 0x0b, 0x96, 0xa2, 0xab, 0x01, 0x0b, 0xe4, 0x9e, 0x25, 0xe1, 0xb5, + 0x7f, 0xc3, 0x94, 0xcf, 0xec, 0xe3, 0xd7, 0xf4, 0xa3, 0xaa, 0x33, 0xd6, 0xd7, 0x0c, 0x7f, 0x6e, + 0x7e, 0xf8, 0xaf, 0x1f, 0xde, 0xb4, 0xc8, 0x70, 0x21, 0x2d, 0x32, 0xfc, 0x3a, 0xf1, 0xd8, 0xb9, + 0xd3, 0xc0, 0x45, 0x49, 0xa3, 0x9d, 0x06, 0x7e, 0x04, 0x1b, 0x09, 0x1a, 0x94, 0xd6, 0xce, 0xa9, + 0xc3, 0xd5, 0x8d, 0x35, 0xab, 0x1a, 0x75, 0x4f, 0xe1, 0xb6, 0x8b, 0x50, 0x08, 0x06, 0xde, 0x84, + 0x1b, 0xeb, 0xb0, 0x9a, 0x1c, 0x55, 0xb9, 0x4d, 0xfc, 0x76, 0x06, 0x1a, 0x32, 0x8f, 0xc7, 0x71, + 0xcf, 0xf6, 0x9d, 0x20, 0xf4, 0xfc, 0xe8, 0x9e, 0xd7, 0xdb, 0x00, 0x74, 0x71, 0x3f, 0x1a, 0xdf, + 0xf2, 0x8e, 0x16, 0x84, 0xa0, 0xe9, 0x7d, 0x13, 0x4a, 0xdc, 0x1d, 0x12, 0x92, 0xb8, 0xa1, 0xc8, + 0xdd, 0xa1, 0x32, 0xdc, 0xe7, 0xb6, 0xd2, 0x5a, 0x52, 0x49, 0x90, 0x37, 0x22, 0x88, 0xd1, 0xe1, + 0x17, 0xb8, 0xa5, 0xe7, 0xa3, 0x1b, 0x11, 0x0e, 0xed, 0x4b, 0xcc, 0x8a, 0x0d, 0x8c, 0xbf, 0x99, + 0x85, 0xa5, 0xb8, 0x7f, 0x74, 0xdf, 0xca, 0xcb, 0x6f, 0x8e, 0xb9, 0x2b, 0xd9, 0xc1, 0x11, 0x06, + 0x8f, 0xe6, 0xa9, 0x2d, 0xd1, 0xe2, 0x6c, 0xbb, 0xcc, 0x80, 0x8a, 0xa2, 0xf0, 0xa6, 0xa1, 0x76, + 0x85, 0x62, 0x99, 0x48, 0xba, 0xd3, 0x50, 0x58, 0xa8, 0xc2, 0x54, 0x77, 0x5c, 0x69, 0x23, 0x16, + 0xec, 0x71, 0xd8, 0xc6, 0xaf, 0x43, 0x08, 0xb0, 0x28, 0x46, 0x13, 0x29, 0xa8, 0x04, 0x7d, 0x9d, + 0x0c, 0x16, 0x9a, 0x39, 0x34, 0x56, 0x74, 0x6d, 0x9e, 0x2e, 0xb4, 0x8e, 0xb4, 0xf9, 0x37, 0xa1, + 0x42, 0x95, 0xc7, 0x87, 0xbf, 0xf3, 0x66, 0x19, 0x5b, 0x40, 0xbc, 0xf4, 0x9a, 0x79, 0xd3, 0x84, + 0xaf, 0x00, 0xa8, 0x29, 0x4c, 0x93, 0xf9, 0xab, 0x19, 0xb8, 0x99, 0x32, 0x6d, 0x72, 0x95, 0xef, + 0xc0, 0xf2, 0x69, 0x84, 0x54, 0xa3, 0x4b, 0x4b, 0x7d, 0x5d, 0x89, 0xd5, 0xe4, 0x98, 0x9a, 0xf5, + 0xd3, 0x24, 0x20, 0xb6, 0x52, 0x69, 0x06, 0x13, 0x57, 0x0b, 0xa0, 0x4a, 0x44, 0xd3, 0x48, 0x06, + 0xe2, 0x11, 0x6c, 0xb6, 0x2e, 0x85, 0xc4, 0x88, 0x52, 0x6b, 0x07, 0xcf, 0xa7, 0x2a, 0x7a, 0x35, + 0xe3, 0x91, 0xcf, 0xbc, 0x96, 0x47, 0x7e, 0x48, 0x67, 0x91, 0xa3, 0xba, 0x7e, 0x91, 0x4a, 0x70, + 0x03, 0x15, 0x65, 0x4e, 0xb0, 0x0a, 0x75, 0xc7, 0x80, 0x00, 0x51, 0xa5, 0x46, 0x00, 0x4b, 0x87, + 0xd3, 0x51, 0xe8, 0xec, 0x44, 0x20, 0xf6, 0xb1, 0x2c, 0x83, 0xed, 0xa8, 0x51, 0x4b, 0x6d, 0x08, + 0xa2, 0x86, 0x70, 0xb0, 0xc6, 0xa2, 0x22, 0x6b, 0xbe, 0xbd, 0xa5, 0x71, 0xb2, 0x05, 0xe3, 0x26, + 0x6c, 0xc4, 0x4f, 0x34, 0x6c, 0x6a, 0xab, 0xf9, 0xfb, 0x19, 0x4a, 0xc1, 0x27, 0x5c, 0xcf, 0xb5, + 0x27, 0xc1, 0xb9, 0x17, 0xb2, 0x16, 0xac, 0x04, 0x8e, 0x7b, 0x36, 0xe2, 0x7a, 0xf5, 0x81, 0x1c, + 0x84, 0xb5, 0x64, 0xdf, 0xa8, 0x68, 0x60, 0x2e, 0x53, 0x89, 0xb8, 0xb6, 0x80, 0x6d, 0x5f, 0xd7, + 0xc9, 0x98, 0x2d, 0x66, 0x46, 0x63, 0xbe, 0xf3, 0x6d, 0x58, 0x4c, 0x36, 0xc4, 0x3e, 0x95, 0x47, + 0xf8, 0xe3, 0x5e, 0xe5, 0x66, 0xce, 0x37, 0xc7, 0x0c, 0x51, 0x89, 0xc7, 0x3e, 0x30, 0xfe, 0x7a, + 0x06, 0x1a, 0x26, 0x17, 0x9c, 0xab, 0xf5, 0x52, 0xf1, 0xcc, 0x8f, 0xe6, 0x6a, 0xbd, 0xfe, 0x5d, + 0xd5, 0xcd, 0x00, 0xaa, 0x47, 0x1f, 0x5c, 0x3b, 0x19, 0xfb, 0x37, 0xe6, 0xde, 0x68, 0xbb, 0x04, + 0x0b, 0x44, 0x62, 0x6c, 0xc0, 0x9a, 0xec, 0x8f, 0xea, 0x4b, 0x1c, 0x6e, 0x4d, 0xb4, 0x98, 0x08, + 0xb7, 0x6e, 0x42, 0x83, 0xce, 0xea, 0xea, 0x2f, 0x21, 0x0b, 0xee, 0x02, 0x3b, 0xb4, 0x07, 0xb6, + 0xef, 0x79, 0xee, 0x11, 0xf7, 0x65, 0x42, 0x33, 0x6a, 0x98, 0x18, 0x8d, 0x54, 0xaa, 0x30, 0x3d, + 0xa9, 0x8b, 0x63, 0x3d, 0x57, 0xe5, 0x6f, 0xd1, 0x93, 0x61, 0xc2, 0xca, 0xb6, 0xfd, 0x9c, 0xab, + 0x9a, 0xd4, 0x10, 0x3d, 0x86, 0xca, 0x24, 0xaa, 0x54, 0x8d, 0xbb, 0xba, 0x62, 0x64, 0xbe, 0x59, + 0x53, 0xa7, 0x36, 0x1e, 0xc2, 0x6a, 0xb2, 0x4e, 0x29, 0x3a, 0x36, 0xa1, 0x34, 0x96, 0x30, 0xd9, + 0xbb, 0xe8, 0xd9, 0xf8, 0xad, 0x12, 0x14, 0xa5, 0xa5, 0xca, 0xb6, 0x20, 0x3f, 0x50, 0x39, 0x74, + 0xf1, 0xd5, 0x56, 0x12, 0xab, 0xfe, 0xef, 0x60, 0x26, 0x9d, 0xa0, 0x63, 0x8f, 0x61, 0x31, 0x19, + 0x46, 0x9e, 0xb9, 0x09, 0x20, 0x19, 0xff, 0xad, 0x0d, 0x66, 0x02, 0x86, 0xe5, 0x78, 0x73, 0x24, + 0x9d, 0xa1, 0x74, 0xae, 0xed, 0x9e, 0x9e, 0x2b, 0xf4, 0xed, 0xe0, 0xdc, 0xb6, 0x1e, 0x3e, 0xfa, + 0x44, 0x5e, 0x05, 0x50, 0x41, 0x60, 0xef, 0xdc, 0x7e, 0xf8, 0xe8, 0x93, 0x59, 0x4d, 0x5a, 0x5e, + 0x04, 0xa0, 0x69, 0xd2, 0xab, 0x50, 0xa0, 0x1b, 0x52, 0x29, 0x19, 0x8a, 0x1e, 0xd8, 0x03, 0x58, + 0x55, 0xce, 0x0f, 0x99, 0xb6, 0x4e, 0x52, 0xb0, 0x44, 0x27, 0x05, 0x25, 0xae, 0x87, 0x28, 0x72, + 0x97, 0xac, 0xc3, 0xc2, 0x79, 0x7c, 0xdd, 0x6d, 0xcd, 0x94, 0x4f, 0xc6, 0x1f, 0x14, 0xa0, 0xa2, + 0x0d, 0x0a, 0xab, 0x42, 0xc9, 0x6c, 0xf5, 0x5a, 0xe6, 0xb3, 0xd6, 0x6e, 0xfd, 0x06, 0xbb, 0x07, + 0xef, 0xb4, 0x3b, 0x3b, 0x5d, 0xd3, 0x6c, 0xed, 0xf4, 0xad, 0xae, 0x69, 0xa9, 0x0b, 0xd6, 0x8e, + 0x9a, 0x5f, 0x1f, 0xb6, 0x3a, 0x7d, 0x6b, 0xb7, 0xd5, 0x6f, 0xb6, 0x0f, 0x7a, 0xf5, 0x0c, 0x7b, + 0x03, 0x1a, 0x31, 0xa5, 0x42, 0x37, 0x0f, 0xbb, 0xc7, 0x9d, 0x7e, 0x3d, 0xcb, 0xee, 0xc0, 0xad, + 0xbd, 0x76, 0xa7, 0x79, 0x60, 0xc5, 0x34, 0x3b, 0x07, 0xfd, 0x67, 0x56, 0xeb, 0x57, 0x8f, 0xda, + 0xe6, 0xd7, 0xf5, 0x5c, 0x1a, 0xc1, 0x7e, 0xff, 0x60, 0x47, 0xd5, 0x90, 0x67, 0x37, 0x61, 0x8d, + 0x08, 0xa8, 0x88, 0xd5, 0xef, 0x76, 0xad, 0x5e, 0xb7, 0xdb, 0xa9, 0x17, 0xd8, 0x32, 0xd4, 0xda, + 0x9d, 0x67, 0xcd, 0x83, 0xf6, 0xae, 0x65, 0xb6, 0x9a, 0x07, 0x87, 0xf5, 0x05, 0xb6, 0x02, 0x4b, + 0xb3, 0x74, 0x45, 0x51, 0x85, 0xa2, 0xeb, 0x76, 0xda, 0xdd, 0x8e, 0xf5, 0xac, 0x65, 0xf6, 0xda, + 0xdd, 0x4e, 0xbd, 0xc4, 0xd6, 0x81, 0x25, 0x51, 0xfb, 0x87, 0xcd, 0x9d, 0x7a, 0x99, 0xad, 0xc1, + 0x72, 0x12, 0xfe, 0xb4, 0xf5, 0x75, 0x1d, 0x58, 0x03, 0x56, 0xa9, 0x63, 0xd6, 0x76, 0xeb, 0xa0, + 0xfb, 0x95, 0x75, 0xd8, 0xee, 0xb4, 0x0f, 0x8f, 0x0f, 0xeb, 0x15, 0xbc, 0xb7, 0xb1, 0xd5, 0xb2, + 0xda, 0x9d, 0xde, 0xf1, 0xde, 0x5e, 0x7b, 0xa7, 0xdd, 0xea, 0xf4, 0xeb, 0x55, 0x6a, 0x39, 0xed, + 0xc5, 0x6b, 0xa2, 0x80, 0x3c, 0xdb, 0x62, 0xed, 0xb6, 0x7b, 0xcd, 0xed, 0x83, 0xd6, 0x6e, 0x7d, + 0x91, 0xdd, 0x86, 0x9b, 0xfd, 0xd6, 0xe1, 0x51, 0xd7, 0x6c, 0x9a, 0x5f, 0xab, 0xb3, 0x2f, 0xd6, + 0x5e, 0xb3, 0x7d, 0x70, 0x6c, 0xb6, 0xea, 0x4b, 0xec, 0x2d, 0xb8, 0x6d, 0xb6, 0xbe, 0x3c, 0x6e, + 0x9b, 0xad, 0x5d, 0xab, 0xd3, 0xdd, 0x6d, 0x59, 0x7b, 0xad, 0x66, 0xff, 0xd8, 0x6c, 0x59, 0x87, + 0xed, 0x5e, 0xaf, 0xdd, 0x79, 0x52, 0xaf, 0xb3, 0x77, 0xe0, 0x6e, 0x44, 0x12, 0x55, 0x30, 0x43, + 0xb5, 0x2c, 0xde, 0x4f, 0x4d, 0x69, 0xa7, 0xf5, 0xab, 0x7d, 0xeb, 0xa8, 0xd5, 0x32, 0xeb, 0x8c, + 0x6d, 0xc2, 0x7a, 0xdc, 0x3c, 0x35, 0x20, 0xdb, 0x5e, 0x11, 0xb8, 0xa3, 0x96, 0x79, 0xd8, 0xec, + 0x88, 0x09, 0x4e, 0xe0, 0x56, 0x45, 0xb7, 0x63, 0xdc, 0x6c, 0xb7, 0xd7, 0x18, 0x83, 0x45, 0x6d, + 0x56, 0xf6, 0x9a, 0x66, 0x7d, 0x9d, 0x2d, 0x41, 0xe5, 0xf0, 0xe8, 0xc8, 0xea, 0xb7, 0x0f, 0x5b, + 0xdd, 0xe3, 0x7e, 0x7d, 0x83, 0xad, 0x41, 0xbd, 0xdd, 0xe9, 0xb7, 0x4c, 0x31, 0xd7, 0xaa, 0xe8, + 0x7f, 0x2b, 0xb2, 0x55, 0x58, 0x52, 0x3d, 0x55, 0xd0, 0x3f, 0x2e, 0xb2, 0x0d, 0x60, 0xc7, 0x1d, + 0xb3, 0xd5, 0xdc, 0x15, 0x03, 0x17, 0x21, 0xfe, 0x7b, 0x51, 0x86, 0x94, 0x7e, 0x9e, 0x8b, 0x36, + 0xeb, 0x38, 0x47, 0x23, 0x79, 0xf9, 0x79, 0x55, 0xbb, 0xb4, 0xfc, 0x55, 0x9f, 0x30, 0xd1, 0x4c, + 0xab, 0xdc, 0x9c, 0x69, 0x35, 0x67, 0xbb, 0xd7, 0x74, 0xdd, 0xef, 0x6d, 0xa8, 0x8d, 0xe9, 0x22, + 0x74, 0x79, 0xe1, 0x31, 0xc8, 0x84, 0x25, 0x02, 0xd2, 0x6d, 0xc7, 0x73, 0xdf, 0xf0, 0x28, 0xcc, + 0x7f, 0xc3, 0x23, 0x4d, 0xbf, 0x5f, 0x48, 0xd3, 0xef, 0xef, 0xc3, 0x32, 0x89, 0x26, 0xc7, 0x75, + 0xc6, 0xca, 0x6a, 0x26, 0x2d, 0x70, 0x09, 0x45, 0x14, 0xc1, 0x95, 0x39, 0xa1, 0x4c, 0x0e, 0x29, + 0x42, 0x8a, 0xd2, 0xda, 0x48, 0x58, 0x1a, 0x24, 0x39, 0x22, 0x4b, 0x23, 0x6a, 0xc1, 0xbe, 0x8c, + 0x5b, 0xa8, 0x68, 0x2d, 0x10, 0x1c, 0x5b, 0xb8, 0x0f, 0xcb, 0xfc, 0x32, 0xf4, 0x6d, 0xcb, 0x9b, + 0xd8, 0xdf, 0x4c, 0x31, 0xe6, 0x6d, 0xa3, 0x0d, 0x5f, 0x35, 0x97, 0x10, 0xd1, 0x45, 0xf8, 0xae, + 0x1d, 0xda, 0xf7, 0xff, 0x3c, 0x54, 0xb4, 0x4b, 0xf2, 0xd9, 0x06, 0xac, 0x7c, 0xd5, 0xee, 0x77, + 0x5a, 0xbd, 0x9e, 0x75, 0x74, 0xbc, 0xfd, 0xb4, 0xf5, 0xb5, 0xb5, 0xdf, 0xec, 0xed, 0xd7, 0x6f, + 0x88, 0x45, 0xdb, 0x69, 0xf5, 0xfa, 0xad, 0xdd, 0x04, 0x3c, 0xc3, 0xde, 0x84, 0xcd, 0xe3, 0xce, + 0x71, 0xaf, 0xb5, 0x6b, 0xa5, 0x95, 0xcb, 0x0a, 0x2e, 0x95, 0xf8, 0x94, 0xe2, 0xb9, 0xfb, 0xbf, + 0x01, 0x8b, 0xc9, 0x63, 0xe0, 0x0c, 0x60, 0xe1, 0xa0, 0xf5, 0xa4, 0xb9, 0xf3, 0x35, 0xdd, 0xec, + 0xda, 0xeb, 0x37, 0xfb, 0xed, 0x1d, 0x4b, 0xde, 0xe4, 0x2a, 0x24, 0x42, 0x86, 0x55, 0xa0, 0xd8, + 0xec, 0xec, 0xec, 0x77, 0xcd, 0x5e, 0x3d, 0xcb, 0xde, 0x80, 0x0d, 0xc5, 0xab, 0x3b, 0xdd, 0xc3, + 0xc3, 0x76, 0x1f, 0x85, 0x61, 0xff, 0xeb, 0x23, 0xc1, 0x9a, 0xf7, 0x6d, 0x28, 0xc7, 0x57, 0xd1, + 0xa2, 0x80, 0x69, 0xf7, 0xdb, 0xcd, 0x7e, 0x2c, 0x5d, 0xeb, 0x37, 0x84, 0xfc, 0x8a, 0xc1, 0x78, + 0x93, 0x6c, 0x3d, 0x43, 0x27, 0xe5, 0x14, 0x90, 0x5a, 0xaf, 0x67, 0xc5, 0xa2, 0x8a, 0xa1, 0xdb, + 0xdd, 0xbe, 0x78, 0x85, 0xcf, 0x61, 0x31, 0x99, 0x0f, 0x99, 0x74, 0x6c, 0x6f, 0xc2, 0xfa, 0x76, + 0xab, 0xff, 0x55, 0xab, 0xd5, 0xc1, 0xd1, 0xd9, 0x69, 0x75, 0xfa, 0x66, 0xf3, 0xa0, 0xdd, 0xff, + 0xba, 0x9e, 0xb9, 0xff, 0x18, 0xea, 0xb3, 0xc1, 0xc7, 0x44, 0xb4, 0xf6, 0x65, 0x61, 0xdd, 0xfb, + 0xff, 0x39, 0x03, 0xab, 0x69, 0x7e, 0x77, 0x31, 0x87, 0x72, 0x71, 0x0a, 0x11, 0xdd, 0xeb, 0x76, + 0xac, 0x4e, 0x17, 0xaf, 0x8e, 0xdc, 0x84, 0xf5, 0x19, 0x84, 0x92, 0x04, 0x19, 0x76, 0x0b, 0x36, + 0xe6, 0x0a, 0x59, 0x66, 0xf7, 0x18, 0x5f, 0xbb, 0x01, 0xab, 0x33, 0xc8, 0x96, 0x69, 0x76, 0xcd, + 0x7a, 0x8e, 0x7d, 0x00, 0xf7, 0x66, 0x30, 0xf3, 0x1b, 0x93, 0xda, 0xb7, 0xf2, 0xec, 0x3d, 0x78, + 0x7b, 0x8e, 0x3a, 0x96, 0xdd, 0xd6, 0x76, 0xf3, 0x40, 0xbc, 0x5e, 0xbd, 0x70, 0xff, 0x1f, 0xe7, + 0x00, 0xe2, 0x03, 0x47, 0xa2, 0xfd, 0xdd, 0x66, 0xbf, 0x79, 0xd0, 0x15, 0xec, 0x65, 0x76, 0xfb, + 0xa2, 0x76, 0xb3, 0xf5, 0x65, 0xfd, 0x46, 0x2a, 0xa6, 0x7b, 0x24, 0x5e, 0x68, 0x03, 0x56, 0x68, + 0xaa, 0x0e, 0xc4, 0x6b, 0xb4, 0x3b, 0x4f, 0xe8, 0x16, 0x52, 0xdc, 0xfd, 0x8e, 0x8f, 0xf6, 0xcc, + 0x6e, 0xa7, 0x6f, 0xf5, 0xf6, 0x8f, 0xfb, 0xbb, 0x78, 0x87, 0xe9, 0x8e, 0xd9, 0x3e, 0xa2, 0x3a, + 0xf3, 0x2f, 0x23, 0x10, 0x55, 0x17, 0xc4, 0x5a, 0x78, 0xd2, 0xed, 0xf5, 0xda, 0x47, 0xd6, 0x97, + 0xc7, 0x2d, 0xb3, 0xdd, 0xea, 0x61, 0xc1, 0x85, 0x14, 0xb8, 0xa0, 0x2f, 0x8a, 0x3d, 0xb3, 0x7f, + 0xf0, 0x4c, 0x6e, 0x6a, 0x82, 0xb4, 0x94, 0x04, 0x09, 0xaa, 0xb2, 0x98, 0x1d, 0xb1, 0x2b, 0xa4, + 0xd4, 0x0c, 0xd7, 0xe0, 0x44, 0xb9, 0x8a, 0xd8, 0xef, 0xe6, 0x16, 0x09, 0x16, 0xab, 0xa6, 0xa3, + 0x44, 0x29, 0xdc, 0x0a, 0x23, 0xc5, 0x61, 0x77, 0xd7, 0xc4, 0x02, 0x8b, 0x73, 0x50, 0x41, 0xbb, + 0x24, 0x98, 0x50, 0x6c, 0x1b, 0x82, 0xa4, 0xae, 0x1e, 0x04, 0x66, 0xf9, 0xe1, 0xff, 0x79, 0x13, + 0xca, 0x51, 0xe2, 0x31, 0xfb, 0x29, 0xd4, 0x12, 0x27, 0x41, 0x99, 0x72, 0x0b, 0xa6, 0x1d, 0x1c, + 0xdd, 0x7c, 0x23, 0x1d, 0x29, 0x35, 0xd0, 0x43, 0xcd, 0xc2, 0xa0, 0xca, 0xde, 0x98, 0xd5, 0xfa, + 0x13, 0xb5, 0xdd, 0xbe, 0x06, 0x2b, 0xab, 0x7b, 0x8a, 0x17, 0xa2, 0xea, 0x9f, 0x25, 0x64, 0xb7, + 0xe3, 0xdb, 0x29, 0x53, 0x3e, 0x57, 0xb8, 0x79, 0x73, 0xfe, 0x03, 0x82, 0xea, 0x8b, 0x83, 0xbb, + 0x50, 0xd1, 0xbe, 0xb6, 0xc3, 0x6e, 0x5e, 0xfb, 0x65, 0xa0, 0xcd, 0xcd, 0x34, 0x94, 0xec, 0xd2, + 0x17, 0x50, 0x8e, 0xbe, 0xbc, 0xc2, 0x36, 0xb4, 0xaf, 0xe6, 0xe8, 0xdf, 0x8f, 0xd9, 0x6c, 0xcc, + 0x23, 0x64, 0xf9, 0x5d, 0xa8, 0x68, 0x1f, 0x50, 0x89, 0x7a, 0x31, 0xff, 0x91, 0x96, 0xa8, 0x17, + 0x69, 0xdf, 0x5b, 0x39, 0x80, 0x35, 0x69, 0xc7, 0x9c, 0xf0, 0x6f, 0x33, 0x3c, 0x29, 0xdf, 0x57, + 0x7c, 0x90, 0x61, 0x8f, 0xa1, 0xa4, 0x3e, 0x95, 0xc3, 0xd6, 0xd3, 0x3f, 0x04, 0xb4, 0xb9, 0x31, + 0x07, 0x97, 0x5d, 0x69, 0x02, 0xc4, 0x9f, 0x66, 0x61, 0xea, 0xc5, 0xe7, 0x3e, 0xf5, 0x12, 0xcd, + 0x4c, 0xca, 0x77, 0x5c, 0x76, 0xa1, 0xa2, 0x7d, 0x85, 0x25, 0x1a, 0x93, 0xf9, 0x2f, 0xb8, 0x44, + 0x63, 0x92, 0xf6, 0xd1, 0x96, 0x9f, 0x42, 0x2d, 0xf1, 0x39, 0x95, 0x88, 0x8f, 0xd3, 0x3e, 0xd6, + 0x12, 0xf1, 0x71, 0xfa, 0x17, 0x58, 0x76, 0xa1, 0xa2, 0x7d, 0xfc, 0x24, 0xea, 0xd1, 0xfc, 0x77, + 0x56, 0xa2, 0x1e, 0xa5, 0x7c, 0x2b, 0x45, 0xac, 0x86, 0xe4, 0x97, 0x4f, 0xa2, 0xd5, 0x90, 0xfa, + 0x09, 0x95, 0x68, 0x35, 0xa4, 0x7f, 0x2e, 0x45, 0xb0, 0x5e, 0x74, 0x13, 0x32, 0xdb, 0xd0, 0xb8, + 0x43, 0xbf, 0x52, 0x39, 0x62, 0xbd, 0xf9, 0x4b, 0x93, 0x9f, 0xc0, 0x4a, 0xc4, 0x34, 0xd1, 0x3d, + 0xc6, 0x41, 0xd4, 0xa7, 0xd4, 0xdb, 0x92, 0x37, 0xeb, 0xb3, 0xd8, 0x07, 0x19, 0xf6, 0x19, 0x14, + 0xe5, 0xe5, 0xb0, 0x6c, 0x6d, 0xf6, 0xb2, 0x58, 0xea, 0xc4, 0x7a, 0xfa, 0x1d, 0xb2, 0xec, 0x08, + 0x96, 0x66, 0xef, 0x07, 0xbe, 0x7d, 0xdd, 0x7d, 0x0a, 0x54, 0xd3, 0x9b, 0x2f, 0xbf, 0x6e, 0x81, + 0x3d, 0x81, 0xaa, 0xfe, 0x29, 0x03, 0xa6, 0xaf, 0x9a, 0xd9, 0xba, 0x6e, 0xa5, 0xe2, 0x64, 0x45, + 0xcf, 0x60, 0x3d, 0x1a, 0x1d, 0xfd, 0x70, 0x7f, 0xc0, 0xee, 0xa4, 0x1c, 0xf9, 0x4f, 0x8c, 0xd1, + 0xcd, 0x6b, 0xef, 0x04, 0x78, 0x90, 0x41, 0x91, 0x98, 0xb8, 0xa0, 0x3d, 0x16, 0x89, 0x69, 0xf7, + 0xd2, 0xc7, 0x22, 0x31, 0xfd, 0x56, 0xf7, 0x26, 0x2c, 0x69, 0x97, 0x13, 0xf4, 0xae, 0xdc, 0x41, + 0xc4, 0x9d, 0xf3, 0x17, 0x75, 0x6e, 0xa6, 0xf9, 0xbe, 0xd8, 0x0e, 0x54, 0xf4, 0xfb, 0x0d, 0x5e, + 0x52, 0x7c, 0x43, 0x43, 0xe9, 0x57, 0x3f, 0x3e, 0xc8, 0xb0, 0x03, 0xa8, 0xcf, 0xde, 0x46, 0x16, + 0x2d, 0xb8, 0xb4, 0x1b, 0xdc, 0x36, 0x67, 0x90, 0x89, 0x3b, 0xcc, 0x04, 0x5f, 0x24, 0xbe, 0xba, + 0xe7, 0xf9, 0xb3, 0x1b, 0x47, 0xf2, 0x6b, 0x7c, 0x51, 0x6d, 0x69, 0xdf, 0x61, 0xbc, 0x97, 0x79, + 0x90, 0x61, 0x7b, 0x50, 0x4d, 0x5c, 0xc6, 0x93, 0xc8, 0x58, 0x9f, 0x79, 0xcd, 0x86, 0x8e, 0x9b, + 0x79, 0xcf, 0x43, 0x58, 0x4c, 0x06, 0x69, 0xa3, 0x8e, 0xa5, 0x86, 0x83, 0xa3, 0xe9, 0x4b, 0x8f, + 0xec, 0xb2, 0x1f, 0xd3, 0x37, 0x65, 0x55, 0x42, 0x0e, 0x9b, 0xff, 0x06, 0x69, 0x34, 0x67, 0xfa, + 0x17, 0x3b, 0x8d, 0xdc, 0x5f, 0xc9, 0x66, 0xf0, 0xbd, 0x7e, 0x44, 0x5f, 0x74, 0x53, 0x39, 0x19, + 0x62, 0xfe, 0x5f, 0xb7, 0x12, 0xb6, 0x47, 0x8d, 0xcb, 0xef, 0x69, 0xc6, 0x72, 0x76, 0xee, 0x1b, + 0x9b, 0xaf, 0xe8, 0x43, 0x93, 0xfa, 0x20, 0xcb, 0x24, 0x78, 0xf0, 0x35, 0xeb, 0x62, 0x9f, 0x02, + 0xc4, 0x89, 0x6e, 0x6c, 0x26, 0xdd, 0x2a, 0x5a, 0x50, 0x29, 0xb9, 0x70, 0x2d, 0x5a, 0xef, 0x51, + 0xbe, 0x97, 0xbe, 0x81, 0x26, 0x53, 0xcf, 0x12, 0x1b, 0xe8, 0x6c, 0x35, 0x3f, 0x84, 0xda, 0x81, + 0xe7, 0x3d, 0x9f, 0x4e, 0xa2, 0x6c, 0xe9, 0x64, 0x32, 0x82, 0x30, 0x66, 0x37, 0x67, 0xba, 0xc5, + 0x9a, 0xb0, 0x1c, 0x89, 0x88, 0x38, 0xe1, 0x2c, 0x49, 0x94, 0x10, 0x0c, 0x33, 0x15, 0x3c, 0xc8, + 0xb0, 0x87, 0x50, 0xdd, 0xe5, 0x03, 0x3c, 0x2c, 0x8f, 0x61, 0xf3, 0x95, 0x44, 0x08, 0x96, 0xe2, + 0xed, 0x9b, 0xb5, 0x04, 0x50, 0x89, 0xb8, 0x38, 0xfd, 0x42, 0x97, 0xf0, 0xc9, 0x1c, 0x86, 0x84, + 0x88, 0x9b, 0x4b, 0xc1, 0x78, 0x06, 0xcb, 0x73, 0x09, 0x0e, 0x91, 0x74, 0xbb, 0x2e, 0x2d, 0x62, + 0xf3, 0xee, 0xf5, 0x04, 0xb2, 0xde, 0x9f, 0x40, 0x8d, 0x6e, 0x02, 0x3d, 0xe1, 0x74, 0xd8, 0x6d, + 0xe6, 0xa6, 0x18, 0xfd, 0x24, 0xdd, 0xac, 0x48, 0xa2, 0x02, 0x4f, 0xf0, 0x32, 0x7c, 0xed, 0x28, + 0x59, 0x34, 0xaf, 0xf3, 0xc7, 0xdb, 0xa2, 0x79, 0x4d, 0x3b, 0xb5, 0xf6, 0x39, 0x54, 0x9e, 0xf0, + 0x50, 0x1d, 0xce, 0x8a, 0xb4, 0x99, 0x99, 0xd3, 0x5a, 0x9b, 0x29, 0x47, 0xea, 0xd8, 0x27, 0x58, + 0x34, 0x3a, 0x68, 0xbc, 0xae, 0xb5, 0xa2, 0x17, 0x5d, 0x9a, 0x81, 0x0b, 0x5d, 0x41, 0xbb, 0x6e, + 0x20, 0xea, 0xf8, 0xfc, 0xf5, 0x12, 0x51, 0xc7, 0xd3, 0x6e, 0x27, 0xf8, 0x31, 0x8d, 0x80, 0x76, + 0x1c, 0x2c, 0x56, 0x98, 0x66, 0x4f, 0x8e, 0x45, 0xdd, 0xd7, 0xc9, 0x1f, 0x01, 0xf4, 0x42, 0x6f, + 0xb2, 0x6b, 0xf3, 0xb1, 0xe7, 0xc6, 0x32, 0x21, 0x3e, 0x88, 0x14, 0x2f, 0x44, 0xed, 0x34, 0x12, + 0xfb, 0x4a, 0xd3, 0x24, 0x13, 0x53, 0xa2, 0xa6, 0xfd, 0xda, 0xb3, 0x4a, 0xd1, 0xeb, 0xa4, 0x9c, + 0x57, 0x42, 0x21, 0x01, 0x71, 0xee, 0x49, 0xa4, 0x17, 0xce, 0xa5, 0xb5, 0x44, 0x6b, 0x3d, 0x25, + 0x51, 0xe5, 0x0b, 0x28, 0xc7, 0x41, 0xfb, 0x8d, 0xf8, 0xee, 0x93, 0x44, 0x88, 0x3f, 0x92, 0xde, + 0xf3, 0x01, 0xf3, 0x0e, 0xac, 0x50, 0x77, 0xa2, 0xed, 0x0f, 0x8f, 0xcb, 0x44, 0xdf, 0x72, 0x98, + 0x8f, 0x54, 0x47, 0xeb, 0x27, 0x2d, 0xde, 0x2a, 0xd6, 0xcf, 0x5c, 0xdc, 0x2e, 0x5a, 0x3f, 0xd7, + 0x05, 0x62, 0xa3, 0xf5, 0x73, 0x7d, 0xc8, 0xaf, 0x03, 0x2b, 0x29, 0x11, 0x38, 0xf6, 0x96, 0x32, + 0x43, 0xae, 0x8d, 0xce, 0x6d, 0xa6, 0x46, 0x6a, 0x58, 0x1f, 0x36, 0xa8, 0x4c, 0x73, 0x34, 0x9a, + 0x09, 0xf8, 0xbc, 0xa9, 0x15, 0x48, 0x09, 0x62, 0x25, 0x54, 0x99, 0x99, 0x40, 0x56, 0x07, 0xea, + 0xb3, 0xb1, 0x12, 0x76, 0x3d, 0xf9, 0xe6, 0x9d, 0x84, 0x82, 0x3d, 0x1f, 0x5f, 0x61, 0xcf, 0xa2, + 0x88, 0xcd, 0x4c, 0x1f, 0xef, 0x44, 0x17, 0x3a, 0xa7, 0xc7, 0x97, 0x22, 0xdd, 0x3d, 0x35, 0xe0, + 0xc3, 0x7e, 0x15, 0x36, 0x66, 0x39, 0x5a, 0xd5, 0x7c, 0x37, 0x6d, 0xb8, 0xae, 0x55, 0xe5, 0x92, + 0x2f, 0xf4, 0x20, 0x23, 0x04, 0xb1, 0x1e, 0x77, 0x89, 0x18, 0x29, 0x25, 0xc0, 0x13, 0x31, 0x52, + 0x5a, 0xa0, 0x66, 0xfb, 0xbd, 0x5f, 0xfb, 0xde, 0x99, 0x13, 0x9e, 0x4f, 0x4f, 0xb6, 0x06, 0xde, + 0xf8, 0xc3, 0x91, 0x32, 0xc5, 0xe5, 0x21, 0xca, 0x0f, 0x47, 0xee, 0xf0, 0x43, 0x2c, 0x7d, 0xb2, + 0x30, 0xf1, 0xbd, 0xd0, 0xfb, 0xe1, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xeb, 0x43, 0xf6, 0x73, + 0xe4, 0x81, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -13787,6 +13756,176 @@ type LightningServer interface { BakeMacaroon(context.Context, *BakeMacaroonRequest) (*BakeMacaroonResponse, error) } +// UnimplementedLightningServer can be embedded to have forward compatible implementations. +type UnimplementedLightningServer struct { +} + +func (*UnimplementedLightningServer) WalletBalance(ctx context.Context, req *WalletBalanceRequest) (*WalletBalanceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method WalletBalance not implemented") +} +func (*UnimplementedLightningServer) ChannelBalance(ctx context.Context, req *ChannelBalanceRequest) (*ChannelBalanceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChannelBalance not implemented") +} +func (*UnimplementedLightningServer) GetTransactions(ctx context.Context, req *GetTransactionsRequest) (*TransactionDetails, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTransactions not implemented") +} +func (*UnimplementedLightningServer) EstimateFee(ctx context.Context, req *EstimateFeeRequest) (*EstimateFeeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EstimateFee not implemented") +} +func (*UnimplementedLightningServer) SendCoins(ctx context.Context, req *SendCoinsRequest) (*SendCoinsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SendCoins not implemented") +} +func (*UnimplementedLightningServer) ListUnspent(ctx context.Context, req *ListUnspentRequest) (*ListUnspentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListUnspent not implemented") +} +func (*UnimplementedLightningServer) SubscribeTransactions(req *GetTransactionsRequest, srv Lightning_SubscribeTransactionsServer) error { + return status.Errorf(codes.Unimplemented, "method SubscribeTransactions not implemented") +} +func (*UnimplementedLightningServer) SendMany(ctx context.Context, req *SendManyRequest) (*SendManyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SendMany not implemented") +} +func (*UnimplementedLightningServer) NewAddress(ctx context.Context, req *NewAddressRequest) (*NewAddressResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewAddress not implemented") +} +func (*UnimplementedLightningServer) SignMessage(ctx context.Context, req *SignMessageRequest) (*SignMessageResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SignMessage not implemented") +} +func (*UnimplementedLightningServer) VerifyMessage(ctx context.Context, req *VerifyMessageRequest) (*VerifyMessageResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method VerifyMessage not implemented") +} +func (*UnimplementedLightningServer) ConnectPeer(ctx context.Context, req *ConnectPeerRequest) (*ConnectPeerResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ConnectPeer not implemented") +} +func (*UnimplementedLightningServer) DisconnectPeer(ctx context.Context, req *DisconnectPeerRequest) (*DisconnectPeerResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DisconnectPeer not implemented") +} +func (*UnimplementedLightningServer) ListPeers(ctx context.Context, req *ListPeersRequest) (*ListPeersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListPeers not implemented") +} +func (*UnimplementedLightningServer) SubscribePeerEvents(req *PeerEventSubscription, srv Lightning_SubscribePeerEventsServer) error { + return status.Errorf(codes.Unimplemented, "method SubscribePeerEvents not implemented") +} +func (*UnimplementedLightningServer) GetInfo(ctx context.Context, req *GetInfoRequest) (*GetInfoResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetInfo not implemented") +} +func (*UnimplementedLightningServer) PendingChannels(ctx context.Context, req *PendingChannelsRequest) (*PendingChannelsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PendingChannels not implemented") +} +func (*UnimplementedLightningServer) ListChannels(ctx context.Context, req *ListChannelsRequest) (*ListChannelsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListChannels not implemented") +} +func (*UnimplementedLightningServer) SubscribeChannelEvents(req *ChannelEventSubscription, srv Lightning_SubscribeChannelEventsServer) error { + return status.Errorf(codes.Unimplemented, "method SubscribeChannelEvents not implemented") +} +func (*UnimplementedLightningServer) ClosedChannels(ctx context.Context, req *ClosedChannelsRequest) (*ClosedChannelsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ClosedChannels not implemented") +} +func (*UnimplementedLightningServer) OpenChannelSync(ctx context.Context, req *OpenChannelRequest) (*ChannelPoint, error) { + return nil, status.Errorf(codes.Unimplemented, "method OpenChannelSync not implemented") +} +func (*UnimplementedLightningServer) OpenChannel(req *OpenChannelRequest, srv Lightning_OpenChannelServer) error { + return status.Errorf(codes.Unimplemented, "method OpenChannel not implemented") +} +func (*UnimplementedLightningServer) FundingStateStep(ctx context.Context, req *FundingTransitionMsg) (*FundingStateStepResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method FundingStateStep not implemented") +} +func (*UnimplementedLightningServer) ChannelAcceptor(srv Lightning_ChannelAcceptorServer) error { + return status.Errorf(codes.Unimplemented, "method ChannelAcceptor not implemented") +} +func (*UnimplementedLightningServer) CloseChannel(req *CloseChannelRequest, srv Lightning_CloseChannelServer) error { + return status.Errorf(codes.Unimplemented, "method CloseChannel not implemented") +} +func (*UnimplementedLightningServer) AbandonChannel(ctx context.Context, req *AbandonChannelRequest) (*AbandonChannelResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AbandonChannel not implemented") +} +func (*UnimplementedLightningServer) SendPayment(srv Lightning_SendPaymentServer) error { + return status.Errorf(codes.Unimplemented, "method SendPayment not implemented") +} +func (*UnimplementedLightningServer) SendPaymentSync(ctx context.Context, req *SendRequest) (*SendResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SendPaymentSync not implemented") +} +func (*UnimplementedLightningServer) SendToRoute(srv Lightning_SendToRouteServer) error { + return status.Errorf(codes.Unimplemented, "method SendToRoute not implemented") +} +func (*UnimplementedLightningServer) SendToRouteSync(ctx context.Context, req *SendToRouteRequest) (*SendResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SendToRouteSync not implemented") +} +func (*UnimplementedLightningServer) AddInvoice(ctx context.Context, req *Invoice) (*AddInvoiceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddInvoice not implemented") +} +func (*UnimplementedLightningServer) ListInvoices(ctx context.Context, req *ListInvoiceRequest) (*ListInvoiceResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListInvoices not implemented") +} +func (*UnimplementedLightningServer) LookupInvoice(ctx context.Context, req *PaymentHash) (*Invoice, error) { + return nil, status.Errorf(codes.Unimplemented, "method LookupInvoice not implemented") +} +func (*UnimplementedLightningServer) SubscribeInvoices(req *InvoiceSubscription, srv Lightning_SubscribeInvoicesServer) error { + return status.Errorf(codes.Unimplemented, "method SubscribeInvoices not implemented") +} +func (*UnimplementedLightningServer) DecodePayReq(ctx context.Context, req *PayReqString) (*PayReq, error) { + return nil, status.Errorf(codes.Unimplemented, "method DecodePayReq not implemented") +} +func (*UnimplementedLightningServer) ListPayments(ctx context.Context, req *ListPaymentsRequest) (*ListPaymentsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListPayments not implemented") +} +func (*UnimplementedLightningServer) DeleteAllPayments(ctx context.Context, req *DeleteAllPaymentsRequest) (*DeleteAllPaymentsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteAllPayments not implemented") +} +func (*UnimplementedLightningServer) DescribeGraph(ctx context.Context, req *ChannelGraphRequest) (*ChannelGraph, error) { + return nil, status.Errorf(codes.Unimplemented, "method DescribeGraph not implemented") +} +func (*UnimplementedLightningServer) GetNodeMetrics(ctx context.Context, req *NodeMetricsRequest) (*NodeMetricsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetNodeMetrics not implemented") +} +func (*UnimplementedLightningServer) GetChanInfo(ctx context.Context, req *ChanInfoRequest) (*ChannelEdge, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetChanInfo not implemented") +} +func (*UnimplementedLightningServer) GetNodeInfo(ctx context.Context, req *NodeInfoRequest) (*NodeInfo, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetNodeInfo not implemented") +} +func (*UnimplementedLightningServer) QueryRoutes(ctx context.Context, req *QueryRoutesRequest) (*QueryRoutesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method QueryRoutes not implemented") +} +func (*UnimplementedLightningServer) GetNetworkInfo(ctx context.Context, req *NetworkInfoRequest) (*NetworkInfo, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetNetworkInfo not implemented") +} +func (*UnimplementedLightningServer) StopDaemon(ctx context.Context, req *StopRequest) (*StopResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method StopDaemon not implemented") +} +func (*UnimplementedLightningServer) SubscribeChannelGraph(req *GraphTopologySubscription, srv Lightning_SubscribeChannelGraphServer) error { + return status.Errorf(codes.Unimplemented, "method SubscribeChannelGraph not implemented") +} +func (*UnimplementedLightningServer) DebugLevel(ctx context.Context, req *DebugLevelRequest) (*DebugLevelResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DebugLevel not implemented") +} +func (*UnimplementedLightningServer) FeeReport(ctx context.Context, req *FeeReportRequest) (*FeeReportResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method FeeReport not implemented") +} +func (*UnimplementedLightningServer) UpdateChannelPolicy(ctx context.Context, req *PolicyUpdateRequest) (*PolicyUpdateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateChannelPolicy not implemented") +} +func (*UnimplementedLightningServer) ForwardingHistory(ctx context.Context, req *ForwardingHistoryRequest) (*ForwardingHistoryResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ForwardingHistory not implemented") +} +func (*UnimplementedLightningServer) ExportChannelBackup(ctx context.Context, req *ExportChannelBackupRequest) (*ChannelBackup, error) { + return nil, status.Errorf(codes.Unimplemented, "method ExportChannelBackup not implemented") +} +func (*UnimplementedLightningServer) ExportAllChannelBackups(ctx context.Context, req *ChanBackupExportRequest) (*ChanBackupSnapshot, error) { + return nil, status.Errorf(codes.Unimplemented, "method ExportAllChannelBackups not implemented") +} +func (*UnimplementedLightningServer) VerifyChanBackup(ctx context.Context, req *ChanBackupSnapshot) (*VerifyChanBackupResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method VerifyChanBackup not implemented") +} +func (*UnimplementedLightningServer) RestoreChannelBackups(ctx context.Context, req *RestoreChanBackupRequest) (*RestoreBackupResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RestoreChannelBackups not implemented") +} +func (*UnimplementedLightningServer) SubscribeChannelBackups(req *ChannelBackupSubscription, srv Lightning_SubscribeChannelBackupsServer) error { + return status.Errorf(codes.Unimplemented, "method SubscribeChannelBackups not implemented") +} +func (*UnimplementedLightningServer) BakeMacaroon(ctx context.Context, req *BakeMacaroonRequest) (*BakeMacaroonResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method BakeMacaroon not implemented") +} + func RegisterLightningServer(s *grpc.Server, srv LightningServer) { s.RegisterService(&_Lightning_serviceDesc, srv) } diff --git a/lnrpc/rpc.pb.gw.go b/lnrpc/rpc.pb.gw.go index 43074f29de..736b46e836 100644 --- a/lnrpc/rpc.pb.gw.go +++ b/lnrpc/rpc.pb.gw.go @@ -13,6 +13,7 @@ import ( "io" "net/http" + "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -22,11 +23,13 @@ import ( "google.golang.org/grpc/status" ) +// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage func request_Lightning_WalletBalance_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq WalletBalanceRequest @@ -37,6 +40,15 @@ func request_Lightning_WalletBalance_0(ctx context.Context, marshaler runtime.Ma } +func local_request_Lightning_WalletBalance_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq WalletBalanceRequest + var metadata runtime.ServerMetadata + + msg, err := server.WalletBalance(ctx, &protoReq) + return msg, metadata, err + +} + func request_Lightning_ChannelBalance_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq ChannelBalanceRequest var metadata runtime.ServerMetadata @@ -46,6 +58,15 @@ func request_Lightning_ChannelBalance_0(ctx context.Context, marshaler runtime.M } +func local_request_Lightning_ChannelBalance_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ChannelBalanceRequest + var metadata runtime.ServerMetadata + + msg, err := server.ChannelBalance(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Lightning_GetTransactions_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -54,7 +75,10 @@ func request_Lightning_GetTransactions_0(ctx context.Context, marshaler runtime. var protoReq GetTransactionsRequest var metadata runtime.ServerMetadata - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_GetTransactions_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_GetTransactions_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -63,6 +87,19 @@ func request_Lightning_GetTransactions_0(ctx context.Context, marshaler runtime. } +func local_request_Lightning_GetTransactions_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetTransactionsRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_GetTransactions_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GetTransactions(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Lightning_EstimateFee_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -71,7 +108,10 @@ func request_Lightning_EstimateFee_0(ctx context.Context, marshaler runtime.Mars var protoReq EstimateFeeRequest var metadata runtime.ServerMetadata - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_EstimateFee_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_EstimateFee_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -80,6 +120,19 @@ func request_Lightning_EstimateFee_0(ctx context.Context, marshaler runtime.Mars } +func local_request_Lightning_EstimateFee_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq EstimateFeeRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_EstimateFee_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.EstimateFee(ctx, &protoReq) + return msg, metadata, err + +} + func request_Lightning_SendCoins_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq SendCoinsRequest var metadata runtime.ServerMetadata @@ -97,6 +150,23 @@ func request_Lightning_SendCoins_0(ctx context.Context, marshaler runtime.Marsha } +func local_request_Lightning_SendCoins_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SendCoinsRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SendCoins(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Lightning_ListUnspent_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -105,7 +175,10 @@ func request_Lightning_ListUnspent_0(ctx context.Context, marshaler runtime.Mars var protoReq ListUnspentRequest var metadata runtime.ServerMetadata - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_ListUnspent_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_ListUnspent_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -114,6 +187,81 @@ func request_Lightning_ListUnspent_0(ctx context.Context, marshaler runtime.Mars } +func local_request_Lightning_ListUnspent_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListUnspentRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_ListUnspent_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListUnspent(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Lightning_SubscribeTransactions_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Lightning_SubscribeTransactions_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (Lightning_SubscribeTransactionsClient, runtime.ServerMetadata, error) { + var protoReq GetTransactionsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_SubscribeTransactions_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.SubscribeTransactions(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_Lightning_SendMany_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SendManyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.SendMany(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Lightning_SendMany_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SendManyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SendMany(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Lightning_NewAddress_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -122,7 +270,10 @@ func request_Lightning_NewAddress_0(ctx context.Context, marshaler runtime.Marsh var protoReq NewAddressRequest var metadata runtime.ServerMetadata - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_NewAddress_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_NewAddress_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -131,6 +282,19 @@ func request_Lightning_NewAddress_0(ctx context.Context, marshaler runtime.Marsh } +func local_request_Lightning_NewAddress_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq NewAddressRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_NewAddress_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.NewAddress(ctx, &protoReq) + return msg, metadata, err + +} + func request_Lightning_SignMessage_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq SignMessageRequest var metadata runtime.ServerMetadata @@ -148,6 +312,23 @@ func request_Lightning_SignMessage_0(ctx context.Context, marshaler runtime.Mars } +func local_request_Lightning_SignMessage_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SignMessageRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SignMessage(ctx, &protoReq) + return msg, metadata, err + +} + func request_Lightning_VerifyMessage_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq VerifyMessageRequest var metadata runtime.ServerMetadata @@ -165,6 +346,23 @@ func request_Lightning_VerifyMessage_0(ctx context.Context, marshaler runtime.Ma } +func local_request_Lightning_VerifyMessage_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq VerifyMessageRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.VerifyMessage(ctx, &protoReq) + return msg, metadata, err + +} + func request_Lightning_ConnectPeer_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq ConnectPeerRequest var metadata runtime.ServerMetadata @@ -182,6 +380,23 @@ func request_Lightning_ConnectPeer_0(ctx context.Context, marshaler runtime.Mars } +func local_request_Lightning_ConnectPeer_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ConnectPeerRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ConnectPeer(ctx, &protoReq) + return msg, metadata, err + +} + func request_Lightning_DisconnectPeer_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq DisconnectPeerRequest var metadata runtime.ServerMetadata @@ -209,6 +424,33 @@ func request_Lightning_DisconnectPeer_0(ctx context.Context, marshaler runtime.M } +func local_request_Lightning_DisconnectPeer_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DisconnectPeerRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pub_key"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pub_key") + } + + protoReq.PubKey, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pub_key", err) + } + + msg, err := server.DisconnectPeer(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Lightning_ListPeers_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -217,7 +459,10 @@ func request_Lightning_ListPeers_0(ctx context.Context, marshaler runtime.Marsha var protoReq ListPeersRequest var metadata runtime.ServerMetadata - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_ListPeers_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_ListPeers_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -226,6 +471,36 @@ func request_Lightning_ListPeers_0(ctx context.Context, marshaler runtime.Marsha } +func local_request_Lightning_ListPeers_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListPeersRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_ListPeers_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListPeers(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Lightning_SubscribePeerEvents_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (Lightning_SubscribePeerEventsClient, runtime.ServerMetadata, error) { + var protoReq PeerEventSubscription + var metadata runtime.ServerMetadata + + stream, err := client.SubscribePeerEvents(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + func request_Lightning_GetInfo_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq GetInfoRequest var metadata runtime.ServerMetadata @@ -235,6 +510,15 @@ func request_Lightning_GetInfo_0(ctx context.Context, marshaler runtime.Marshale } +func local_request_Lightning_GetInfo_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetInfoRequest + var metadata runtime.ServerMetadata + + msg, err := server.GetInfo(ctx, &protoReq) + return msg, metadata, err + +} + func request_Lightning_PendingChannels_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq PendingChannelsRequest var metadata runtime.ServerMetadata @@ -244,6 +528,15 @@ func request_Lightning_PendingChannels_0(ctx context.Context, marshaler runtime. } +func local_request_Lightning_PendingChannels_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PendingChannelsRequest + var metadata runtime.ServerMetadata + + msg, err := server.PendingChannels(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Lightning_ListChannels_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -252,7 +545,10 @@ func request_Lightning_ListChannels_0(ctx context.Context, marshaler runtime.Mar var protoReq ListChannelsRequest var metadata runtime.ServerMetadata - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_ListChannels_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_ListChannels_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -261,15 +557,48 @@ func request_Lightning_ListChannels_0(ctx context.Context, marshaler runtime.Mar } -var ( - filter_Lightning_ClosedChannels_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) +func local_request_Lightning_ListChannels_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListChannelsRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_ListChannels_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListChannels(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Lightning_SubscribeChannelEvents_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (Lightning_SubscribeChannelEventsClient, runtime.ServerMetadata, error) { + var protoReq ChannelEventSubscription + var metadata runtime.ServerMetadata + + stream, err := client.SubscribeChannelEvents(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +var ( + filter_Lightning_ClosedChannels_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) func request_Lightning_ClosedChannels_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq ClosedChannelsRequest var metadata runtime.ServerMetadata - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_ClosedChannels_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_ClosedChannels_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -278,6 +607,19 @@ func request_Lightning_ClosedChannels_0(ctx context.Context, marshaler runtime.M } +func local_request_Lightning_ClosedChannels_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ClosedChannelsRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_ClosedChannels_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ClosedChannels(ctx, &protoReq) + return msg, metadata, err + +} + func request_Lightning_OpenChannelSync_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq OpenChannelRequest var metadata runtime.ServerMetadata @@ -295,6 +637,82 @@ func request_Lightning_OpenChannelSync_0(ctx context.Context, marshaler runtime. } +func local_request_Lightning_OpenChannelSync_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq OpenChannelRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.OpenChannelSync(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Lightning_OpenChannel_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (Lightning_OpenChannelClient, runtime.ServerMetadata, error) { + var protoReq OpenChannelRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.OpenChannel(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_Lightning_FundingStateStep_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq FundingTransitionMsg + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.FundingStateStep(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Lightning_FundingStateStep_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq FundingTransitionMsg + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.FundingStateStep(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Lightning_CloseChannel_0 = &utilities.DoubleArray{Encoding: map[string]int{"channel_point": 0, "funding_txid_str": 1, "output_index": 2}, Base: []int{1, 1, 1, 2, 0, 0}, Check: []int{0, 1, 2, 2, 3, 4}} ) @@ -332,7 +750,10 @@ func request_Lightning_CloseChannel_0(ctx context.Context, marshaler runtime.Mar return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_point.output_index", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_CloseChannel_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_CloseChannel_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -386,7 +807,10 @@ func request_Lightning_AbandonChannel_0(ctx context.Context, marshaler runtime.M return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_point.output_index", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_AbandonChannel_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_AbandonChannel_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -395,6 +819,48 @@ func request_Lightning_AbandonChannel_0(ctx context.Context, marshaler runtime.M } +func local_request_Lightning_AbandonChannel_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AbandonChannelRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["channel_point.funding_txid_str"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_point.funding_txid_str") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "channel_point.funding_txid_str", val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_point.funding_txid_str", err) + } + + val, ok = pathParams["channel_point.output_index"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "channel_point.output_index") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "channel_point.output_index", val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "channel_point.output_index", err) + } + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_AbandonChannel_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.AbandonChannel(ctx, &protoReq) + return msg, metadata, err + +} + func request_Lightning_SendPaymentSync_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq SendRequest var metadata runtime.ServerMetadata @@ -412,6 +878,23 @@ func request_Lightning_SendPaymentSync_0(ctx context.Context, marshaler runtime. } +func local_request_Lightning_SendPaymentSync_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SendRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SendPaymentSync(ctx, &protoReq) + return msg, metadata, err + +} + func request_Lightning_SendToRouteSync_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq SendToRouteRequest var metadata runtime.ServerMetadata @@ -429,6 +912,23 @@ func request_Lightning_SendToRouteSync_0(ctx context.Context, marshaler runtime. } +func local_request_Lightning_SendToRouteSync_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SendToRouteRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SendToRouteSync(ctx, &protoReq) + return msg, metadata, err + +} + func request_Lightning_AddInvoice_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq Invoice var metadata runtime.ServerMetadata @@ -446,6 +946,23 @@ func request_Lightning_AddInvoice_0(ctx context.Context, marshaler runtime.Marsh } +func local_request_Lightning_AddInvoice_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq Invoice + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.AddInvoice(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Lightning_ListInvoices_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -454,7 +971,10 @@ func request_Lightning_ListInvoices_0(ctx context.Context, marshaler runtime.Mar var protoReq ListInvoiceRequest var metadata runtime.ServerMetadata - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_ListInvoices_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_ListInvoices_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -463,6 +983,19 @@ func request_Lightning_ListInvoices_0(ctx context.Context, marshaler runtime.Mar } +func local_request_Lightning_ListInvoices_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListInvoiceRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_ListInvoices_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListInvoices(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Lightning_LookupInvoice_0 = &utilities.DoubleArray{Encoding: map[string]int{"r_hash_str": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -489,7 +1022,10 @@ func request_Lightning_LookupInvoice_0(ctx context.Context, marshaler runtime.Ma return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "r_hash_str", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_LookupInvoice_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_LookupInvoice_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -498,6 +1034,37 @@ func request_Lightning_LookupInvoice_0(ctx context.Context, marshaler runtime.Ma } +func local_request_Lightning_LookupInvoice_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PaymentHash + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["r_hash_str"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "r_hash_str") + } + + protoReq.RHashStr, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "r_hash_str", err) + } + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_LookupInvoice_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.LookupInvoice(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Lightning_SubscribeInvoices_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -506,7 +1073,10 @@ func request_Lightning_SubscribeInvoices_0(ctx context.Context, marshaler runtim var protoReq InvoiceSubscription var metadata runtime.ServerMetadata - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_SubscribeInvoices_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_SubscribeInvoices_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -550,19 +1120,62 @@ func request_Lightning_DecodePayReq_0(ctx context.Context, marshaler runtime.Mar } -var ( - filter_Lightning_ListPayments_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} -) - -func request_Lightning_ListPayments_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ListPaymentsRequest +func local_request_Lightning_DecodePayReq_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PayReqString var metadata runtime.ServerMetadata - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_ListPayments_0); err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.ListPayments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pay_req"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pay_req") + } + + protoReq.PayReq, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pay_req", err) + } + + msg, err := server.DecodePayReq(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Lightning_ListPayments_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Lightning_ListPayments_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListPaymentsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_ListPayments_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListPayments(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Lightning_ListPayments_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListPaymentsRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_ListPayments_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListPayments(ctx, &protoReq) return msg, metadata, err } @@ -576,6 +1189,15 @@ func request_Lightning_DeleteAllPayments_0(ctx context.Context, marshaler runtim } +func local_request_Lightning_DeleteAllPayments_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DeleteAllPaymentsRequest + var metadata runtime.ServerMetadata + + msg, err := server.DeleteAllPayments(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Lightning_DescribeGraph_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -584,7 +1206,10 @@ func request_Lightning_DescribeGraph_0(ctx context.Context, marshaler runtime.Ma var protoReq ChannelGraphRequest var metadata runtime.ServerMetadata - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_DescribeGraph_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_DescribeGraph_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -593,6 +1218,19 @@ func request_Lightning_DescribeGraph_0(ctx context.Context, marshaler runtime.Ma } +func local_request_Lightning_DescribeGraph_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ChannelGraphRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_DescribeGraph_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DescribeGraph(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Lightning_GetNodeMetrics_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -601,7 +1239,10 @@ func request_Lightning_GetNodeMetrics_0(ctx context.Context, marshaler runtime.M var protoReq NodeMetricsRequest var metadata runtime.ServerMetadata - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_GetNodeMetrics_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_GetNodeMetrics_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -610,6 +1251,19 @@ func request_Lightning_GetNodeMetrics_0(ctx context.Context, marshaler runtime.M } +func local_request_Lightning_GetNodeMetrics_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq NodeMetricsRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_GetNodeMetrics_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GetNodeMetrics(ctx, &protoReq) + return msg, metadata, err + +} + func request_Lightning_GetChanInfo_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq ChanInfoRequest var metadata runtime.ServerMetadata @@ -637,6 +1291,33 @@ func request_Lightning_GetChanInfo_0(ctx context.Context, marshaler runtime.Mars } +func local_request_Lightning_GetChanInfo_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ChanInfoRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["chan_id"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chan_id") + } + + protoReq.ChanId, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chan_id", err) + } + + msg, err := server.GetChanInfo(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Lightning_GetNodeInfo_0 = &utilities.DoubleArray{Encoding: map[string]int{"pub_key": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} ) @@ -663,7 +1344,10 @@ func request_Lightning_GetNodeInfo_0(ctx context.Context, marshaler runtime.Mars return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pub_key", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_GetNodeInfo_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_GetNodeInfo_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -672,6 +1356,37 @@ func request_Lightning_GetNodeInfo_0(ctx context.Context, marshaler runtime.Mars } +func local_request_Lightning_GetNodeInfo_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq NodeInfoRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pub_key"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pub_key") + } + + protoReq.PubKey, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pub_key", err) + } + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_GetNodeInfo_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GetNodeInfo(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Lightning_QueryRoutes_0 = &utilities.DoubleArray{Encoding: map[string]int{"pub_key": 0, "amt": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} ) @@ -709,7 +1424,10 @@ func request_Lightning_QueryRoutes_0(ctx context.Context, marshaler runtime.Mars return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "amt", err) } - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_QueryRoutes_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_QueryRoutes_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -718,6 +1436,48 @@ func request_Lightning_QueryRoutes_0(ctx context.Context, marshaler runtime.Mars } +func local_request_Lightning_QueryRoutes_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryRoutesRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pub_key"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pub_key") + } + + protoReq.PubKey, err = runtime.String(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pub_key", err) + } + + val, ok = pathParams["amt"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "amt") + } + + protoReq.Amt, err = runtime.Int64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "amt", err) + } + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_QueryRoutes_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.QueryRoutes(ctx, &protoReq) + return msg, metadata, err + +} + func request_Lightning_GetNetworkInfo_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq NetworkInfoRequest var metadata runtime.ServerMetadata @@ -727,17 +1487,17 @@ func request_Lightning_GetNetworkInfo_0(ctx context.Context, marshaler runtime.M } -func request_Lightning_FeeReport_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq FeeReportRequest +func local_request_Lightning_GetNetworkInfo_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq NetworkInfoRequest var metadata runtime.ServerMetadata - msg, err := client.FeeReport(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := server.GetNetworkInfo(ctx, &protoReq) return msg, metadata, err } -func request_Lightning_UpdateChannelPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq PolicyUpdateRequest +func request_Lightning_StopDaemon_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq StopRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -748,13 +1508,13 @@ func request_Lightning_UpdateChannelPolicy_0(ctx context.Context, marshaler runt return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.UpdateChannelPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.StopDaemon(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func request_Lightning_ForwardingHistory_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ForwardingHistoryRequest +func local_request_Lightning_StopDaemon_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq StopRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -765,68 +1525,47 @@ func request_Lightning_ForwardingHistory_0(ctx context.Context, marshaler runtim return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ForwardingHistory(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := server.StopDaemon(ctx, &protoReq) return msg, metadata, err } -var ( - filter_Lightning_ExportChannelBackup_0 = &utilities.DoubleArray{Encoding: map[string]int{"chan_point": 0, "funding_txid_str": 1, "output_index": 2}, Base: []int{1, 1, 1, 2, 0, 0}, Check: []int{0, 1, 2, 2, 3, 4}} -) - -func request_Lightning_ExportChannelBackup_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ExportChannelBackupRequest +func request_Lightning_SubscribeChannelGraph_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (Lightning_SubscribeChannelGraphClient, runtime.ServerMetadata, error) { + var protoReq GraphTopologySubscription var metadata runtime.ServerMetadata - var ( - val string - ok bool - err error - _ = err - ) - - val, ok = pathParams["chan_point.funding_txid_str"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chan_point.funding_txid_str") + stream, err := client.SubscribeChannelGraph(ctx, &protoReq) + if err != nil { + return nil, metadata, err } - - err = runtime.PopulateFieldFromPath(&protoReq, "chan_point.funding_txid_str", val) - + header, err := stream.Header() if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chan_point.funding_txid_str", err) + return nil, metadata, err } + metadata.HeaderMD = header + return stream, metadata, nil - val, ok = pathParams["chan_point.output_index"] - if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chan_point.output_index") - } +} - err = runtime.PopulateFieldFromPath(&protoReq, "chan_point.output_index", val) +func request_Lightning_DebugLevel_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DebugLevelRequest + var metadata runtime.ServerMetadata - if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chan_point.output_index", err) + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) } - - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_ExportChannelBackup_0); err != nil { + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.ExportChannelBackup(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func request_Lightning_ExportAllChannelBackups_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ChanBackupExportRequest - var metadata runtime.ServerMetadata - - msg, err := client.ExportAllChannelBackups(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + msg, err := client.DebugLevel(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } -func request_Lightning_VerifyChanBackup_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ChanBackupSnapshot +func local_request_Lightning_DebugLevel_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DebugLevelRequest var metadata runtime.ServerMetadata newReader, berr := utilities.IOReaderFactory(req.Body) @@ -837,43 +1576,1267 @@ func request_Lightning_VerifyChanBackup_0(ctx context.Context, marshaler runtime return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } - msg, err := client.VerifyChanBackup(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err + msg, err := server.DebugLevel(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Lightning_FeeReport_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq FeeReportRequest + var metadata runtime.ServerMetadata + + msg, err := client.FeeReport(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Lightning_FeeReport_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq FeeReportRequest + var metadata runtime.ServerMetadata + + msg, err := server.FeeReport(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Lightning_UpdateChannelPolicy_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PolicyUpdateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.UpdateChannelPolicy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Lightning_UpdateChannelPolicy_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PolicyUpdateRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.UpdateChannelPolicy(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Lightning_ForwardingHistory_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ForwardingHistoryRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ForwardingHistory(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Lightning_ForwardingHistory_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ForwardingHistoryRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ForwardingHistory(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Lightning_ExportChannelBackup_0 = &utilities.DoubleArray{Encoding: map[string]int{"chan_point": 0, "funding_txid_str": 1, "output_index": 2}, Base: []int{1, 1, 1, 2, 0, 0}, Check: []int{0, 1, 2, 2, 3, 4}} +) + +func request_Lightning_ExportChannelBackup_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ExportChannelBackupRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["chan_point.funding_txid_str"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chan_point.funding_txid_str") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "chan_point.funding_txid_str", val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chan_point.funding_txid_str", err) + } + + val, ok = pathParams["chan_point.output_index"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chan_point.output_index") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "chan_point.output_index", val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chan_point.output_index", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Lightning_ExportChannelBackup_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ExportChannelBackup(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Lightning_ExportChannelBackup_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ExportChannelBackupRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["chan_point.funding_txid_str"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chan_point.funding_txid_str") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "chan_point.funding_txid_str", val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chan_point.funding_txid_str", err) + } + + val, ok = pathParams["chan_point.output_index"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "chan_point.output_index") + } + + err = runtime.PopulateFieldFromPath(&protoReq, "chan_point.output_index", val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "chan_point.output_index", err) + } + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_Lightning_ExportChannelBackup_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ExportChannelBackup(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Lightning_ExportAllChannelBackups_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ChanBackupExportRequest + var metadata runtime.ServerMetadata + + msg, err := client.ExportAllChannelBackups(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Lightning_ExportAllChannelBackups_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ChanBackupExportRequest + var metadata runtime.ServerMetadata + + msg, err := server.ExportAllChannelBackups(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Lightning_VerifyChanBackup_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ChanBackupSnapshot + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.VerifyChanBackup(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Lightning_VerifyChanBackup_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ChanBackupSnapshot + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.VerifyChanBackup(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Lightning_RestoreChannelBackups_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RestoreChanBackupRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.RestoreChannelBackups(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Lightning_RestoreChannelBackups_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RestoreChanBackupRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.RestoreChannelBackups(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Lightning_SubscribeChannelBackups_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (Lightning_SubscribeChannelBackupsClient, runtime.ServerMetadata, error) { + var protoReq ChannelBackupSubscription + var metadata runtime.ServerMetadata + + stream, err := client.SubscribeChannelBackups(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + +func request_Lightning_BakeMacaroon_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq BakeMacaroonRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.BakeMacaroon(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Lightning_BakeMacaroon_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq BakeMacaroonRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.BakeMacaroon(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterLightningHandlerServer registers the http handlers for service Lightning to "mux". +// UnaryRPC :call LightningServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +func RegisterLightningHandlerServer(ctx context.Context, mux *runtime.ServeMux, server LightningServer) error { + + mux.Handle("GET", pattern_Lightning_WalletBalance_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_WalletBalance_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_WalletBalance_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_ChannelBalance_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_ChannelBalance_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_ChannelBalance_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_GetTransactions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_GetTransactions_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_GetTransactions_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_EstimateFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_EstimateFee_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_EstimateFee_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_SendCoins_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_SendCoins_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_SendCoins_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_ListUnspent_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_ListUnspent_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_ListUnspent_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_SubscribeTransactions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_Lightning_SendMany_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_SendMany_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_SendMany_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_NewAddress_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_NewAddress_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_NewAddress_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_SignMessage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_SignMessage_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_SignMessage_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_VerifyMessage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_VerifyMessage_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_VerifyMessage_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_ConnectPeer_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_ConnectPeer_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_ConnectPeer_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_Lightning_DisconnectPeer_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_DisconnectPeer_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_DisconnectPeer_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_ListPeers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_ListPeers_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_ListPeers_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_SubscribePeerEvents_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("GET", pattern_Lightning_GetInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_GetInfo_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_GetInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_PendingChannels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_PendingChannels_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_PendingChannels_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_ListChannels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_ListChannels_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_ListChannels_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_SubscribeChannelEvents_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("GET", pattern_Lightning_ClosedChannels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_ClosedChannels_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_ClosedChannels_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_OpenChannelSync_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_OpenChannelSync_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_OpenChannelSync_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_OpenChannel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_Lightning_FundingStateStep_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_FundingStateStep_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_FundingStateStep_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_Lightning_CloseChannel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("DELETE", pattern_Lightning_AbandonChannel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_AbandonChannel_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_AbandonChannel_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_SendPaymentSync_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_SendPaymentSync_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_SendPaymentSync_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_SendToRouteSync_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_SendToRouteSync_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_SendToRouteSync_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_AddInvoice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_AddInvoice_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_AddInvoice_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_ListInvoices_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_ListInvoices_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_ListInvoices_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_LookupInvoice_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_LookupInvoice_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_LookupInvoice_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_SubscribeInvoices_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("GET", pattern_Lightning_DecodePayReq_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_DecodePayReq_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_DecodePayReq_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_ListPayments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_ListPayments_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_ListPayments_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_Lightning_DeleteAllPayments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_DeleteAllPayments_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_DeleteAllPayments_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_DescribeGraph_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_DescribeGraph_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_DescribeGraph_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_GetNodeMetrics_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_GetNodeMetrics_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_GetNodeMetrics_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_GetChanInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_GetChanInfo_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_GetChanInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_GetNodeInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_GetNodeInfo_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_GetNodeInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_QueryRoutes_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_QueryRoutes_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_QueryRoutes_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_GetNetworkInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_GetNetworkInfo_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_GetNetworkInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_StopDaemon_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_StopDaemon_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_StopDaemon_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_SubscribeChannelGraph_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + + mux.Handle("POST", pattern_Lightning_DebugLevel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_DebugLevel_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_DebugLevel_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_FeeReport_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_FeeReport_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_FeeReport_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_UpdateChannelPolicy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_UpdateChannelPolicy_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_UpdateChannelPolicy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_ForwardingHistory_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_ForwardingHistory_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_ForwardingHistory_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_ExportChannelBackup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_ExportChannelBackup_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_ExportChannelBackup_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_ExportAllChannelBackups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_ExportAllChannelBackups_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_ExportAllChannelBackups_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_VerifyChanBackup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_VerifyChanBackup_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_VerifyChanBackup_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) -} + }) -func request_Lightning_RestoreChannelBackups_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq RestoreChanBackupRequest - var metadata runtime.ServerMetadata + mux.Handle("POST", pattern_Lightning_RestoreChannelBackups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_RestoreChannelBackups_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } + forward_Lightning_RestoreChannelBackups_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - msg, err := client.RestoreChannelBackups(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err + }) -} + mux.Handle("GET", pattern_Lightning_SubscribeChannelBackups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) -func request_Lightning_BakeMacaroon_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq BakeMacaroonRequest - var metadata runtime.ServerMetadata + mux.Handle("POST", pattern_Lightning_BakeMacaroon_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Lightning_BakeMacaroon_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } + forward_Lightning_BakeMacaroon_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - msg, err := client.BakeMacaroon(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err + }) + return nil } // RegisterLightningHandlerFromEndpoint is same as RegisterLightningHandler but @@ -1034,6 +2997,46 @@ func RegisterLightningHandlerClient(ctx context.Context, mux *runtime.ServeMux, }) + mux.Handle("GET", pattern_Lightning_SubscribeTransactions_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Lightning_SubscribeTransactions_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_SubscribeTransactions_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_SendMany_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Lightning_SendMany_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_SendMany_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_Lightning_NewAddress_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1154,6 +3157,26 @@ func RegisterLightningHandlerClient(ctx context.Context, mux *runtime.ServeMux, }) + mux.Handle("GET", pattern_Lightning_SubscribePeerEvents_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Lightning_SubscribePeerEvents_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_SubscribePeerEvents_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_Lightning_GetInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1214,6 +3237,26 @@ func RegisterLightningHandlerClient(ctx context.Context, mux *runtime.ServeMux, }) + mux.Handle("GET", pattern_Lightning_SubscribeChannelEvents_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Lightning_SubscribeChannelEvents_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_SubscribeChannelEvents_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_Lightning_ClosedChannels_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1254,6 +3297,46 @@ func RegisterLightningHandlerClient(ctx context.Context, mux *runtime.ServeMux, }) + mux.Handle("POST", pattern_Lightning_OpenChannel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Lightning_OpenChannel_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_OpenChannel_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_FundingStateStep_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Lightning_FundingStateStep_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_FundingStateStep_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("DELETE", pattern_Lightning_CloseChannel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1594,6 +3677,66 @@ func RegisterLightningHandlerClient(ctx context.Context, mux *runtime.ServeMux, }) + mux.Handle("POST", pattern_Lightning_StopDaemon_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Lightning_StopDaemon_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_StopDaemon_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Lightning_SubscribeChannelGraph_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Lightning_SubscribeChannelGraph_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_SubscribeChannelGraph_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Lightning_DebugLevel_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Lightning_DebugLevel_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_DebugLevel_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_Lightning_FeeReport_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1734,6 +3877,26 @@ func RegisterLightningHandlerClient(ctx context.Context, mux *runtime.ServeMux, }) + mux.Handle("GET", pattern_Lightning_SubscribeChannelBackups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Lightning_SubscribeChannelBackups_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Lightning_SubscribeChannelBackups_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_Lightning_BakeMacaroon_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1758,89 +3921,109 @@ func RegisterLightningHandlerClient(ctx context.Context, mux *runtime.ServeMux, } var ( - pattern_Lightning_WalletBalance_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "balance", "blockchain"}, "")) + pattern_Lightning_WalletBalance_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "balance", "blockchain"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Lightning_ChannelBalance_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "balance", "channels"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Lightning_GetTransactions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "transactions"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Lightning_EstimateFee_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "transactions", "fee"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Lightning_SendCoins_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "transactions"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_ChannelBalance_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "balance", "channels"}, "")) + pattern_Lightning_ListUnspent_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "utxos"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_GetTransactions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "transactions"}, "")) + pattern_Lightning_SubscribeTransactions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "transactions", "subscribe"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_EstimateFee_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "transactions", "fee"}, "")) + pattern_Lightning_SendMany_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "transactions", "many"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_SendCoins_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "transactions"}, "")) + pattern_Lightning_NewAddress_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "newaddress"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_ListUnspent_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "utxos"}, "")) + pattern_Lightning_SignMessage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "signmessage"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_NewAddress_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "newaddress"}, "")) + pattern_Lightning_VerifyMessage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "verifymessage"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_SignMessage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "signmessage"}, "")) + pattern_Lightning_ConnectPeer_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "peers"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_VerifyMessage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "verifymessage"}, "")) + pattern_Lightning_DisconnectPeer_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v1", "peers", "pub_key"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_ConnectPeer_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "peers"}, "")) + pattern_Lightning_ListPeers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "peers"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_DisconnectPeer_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v1", "peers", "pub_key"}, "")) + pattern_Lightning_SubscribePeerEvents_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "peers", "subscribe"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_ListPeers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "peers"}, "")) + pattern_Lightning_GetInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "getinfo"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_GetInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "getinfo"}, "")) + pattern_Lightning_PendingChannels_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "channels", "pending"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_PendingChannels_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "channels", "pending"}, "")) + pattern_Lightning_ListChannels_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "channels"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_ListChannels_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "channels"}, "")) + pattern_Lightning_SubscribeChannelEvents_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "channels", "subscribe"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_ClosedChannels_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "channels", "closed"}, "")) + pattern_Lightning_ClosedChannels_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "channels", "closed"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_OpenChannelSync_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "channels"}, "")) + pattern_Lightning_OpenChannelSync_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "channels"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_CloseChannel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "channels", "channel_point.funding_txid_str", "channel_point.output_index"}, "")) + pattern_Lightning_OpenChannel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "channels", "stream"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_AbandonChannel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4}, []string{"v1", "channels", "abandon", "channel_point.funding_txid_str", "channel_point.output_index"}, "")) + pattern_Lightning_FundingStateStep_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "funding", "step"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_SendPaymentSync_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "channels", "transactions"}, "")) + pattern_Lightning_CloseChannel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "channels", "channel_point.funding_txid_str", "channel_point.output_index"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_SendToRouteSync_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "channels", "transactions", "route"}, "")) + pattern_Lightning_AbandonChannel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4}, []string{"v1", "channels", "abandon", "channel_point.funding_txid_str", "channel_point.output_index"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_AddInvoice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "invoices"}, "")) + pattern_Lightning_SendPaymentSync_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "channels", "transactions"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_ListInvoices_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "invoices"}, "")) + pattern_Lightning_SendToRouteSync_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "channels", "transactions", "route"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_LookupInvoice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v1", "invoice", "r_hash_str"}, "")) + pattern_Lightning_AddInvoice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "invoices"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_SubscribeInvoices_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "invoices", "subscribe"}, "")) + pattern_Lightning_ListInvoices_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "invoices"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_DecodePayReq_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v1", "payreq", "pay_req"}, "")) + pattern_Lightning_LookupInvoice_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v1", "invoice", "r_hash_str"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_ListPayments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "payments"}, "")) + pattern_Lightning_SubscribeInvoices_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "invoices", "subscribe"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_DeleteAllPayments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "payments"}, "")) + pattern_Lightning_DecodePayReq_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v1", "payreq", "pay_req"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_DescribeGraph_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "graph"}, "")) + pattern_Lightning_ListPayments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "payments"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_GetNodeMetrics_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "graph", "nodemetrics"}, "")) + pattern_Lightning_DeleteAllPayments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "payments"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_GetChanInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "graph", "edge", "chan_id"}, "")) + pattern_Lightning_DescribeGraph_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "graph"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_GetNodeInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "graph", "node", "pub_key"}, "")) + pattern_Lightning_GetNodeMetrics_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "graph", "nodemetrics"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_QueryRoutes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4}, []string{"v1", "graph", "routes", "pub_key", "amt"}, "")) + pattern_Lightning_GetChanInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "graph", "edge", "chan_id"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_GetNetworkInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "graph", "info"}, "")) + pattern_Lightning_GetNodeInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v1", "graph", "node", "pub_key"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_FeeReport_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "fees"}, "")) + pattern_Lightning_QueryRoutes_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4}, []string{"v1", "graph", "routes", "pub_key", "amt"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_UpdateChannelPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "chanpolicy"}, "")) + pattern_Lightning_GetNetworkInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "graph", "info"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_ForwardingHistory_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "switch"}, "")) + pattern_Lightning_StopDaemon_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "stop"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_ExportChannelBackup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4}, []string{"v1", "channels", "backup", "chan_point.funding_txid_str", "chan_point.output_index"}, "")) + pattern_Lightning_SubscribeChannelGraph_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "graph", "subscribe"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_ExportAllChannelBackups_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "channels", "backup"}, "")) + pattern_Lightning_DebugLevel_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "debuglevel"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_VerifyChanBackup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "channels", "backup", "verify"}, "")) + pattern_Lightning_FeeReport_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "fees"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_RestoreChannelBackups_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "channels", "backup", "restore"}, "")) + pattern_Lightning_UpdateChannelPolicy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "chanpolicy"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_Lightning_BakeMacaroon_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "macaroon"}, "")) + pattern_Lightning_ForwardingHistory_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "switch"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Lightning_ExportChannelBackup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3, 1, 0, 4, 1, 5, 4}, []string{"v1", "channels", "backup", "chan_point.funding_txid_str", "chan_point.output_index"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Lightning_ExportAllChannelBackups_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "channels", "backup"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Lightning_VerifyChanBackup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "channels", "backup", "verify"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Lightning_RestoreChannelBackups_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "channels", "backup", "restore"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Lightning_SubscribeChannelBackups_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "channels", "backup", "subscribe"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Lightning_BakeMacaroon_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "macaroon"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -1856,6 +4039,10 @@ var ( forward_Lightning_ListUnspent_0 = runtime.ForwardResponseMessage + forward_Lightning_SubscribeTransactions_0 = runtime.ForwardResponseStream + + forward_Lightning_SendMany_0 = runtime.ForwardResponseMessage + forward_Lightning_NewAddress_0 = runtime.ForwardResponseMessage forward_Lightning_SignMessage_0 = runtime.ForwardResponseMessage @@ -1868,16 +4055,24 @@ var ( forward_Lightning_ListPeers_0 = runtime.ForwardResponseMessage + forward_Lightning_SubscribePeerEvents_0 = runtime.ForwardResponseStream + forward_Lightning_GetInfo_0 = runtime.ForwardResponseMessage forward_Lightning_PendingChannels_0 = runtime.ForwardResponseMessage forward_Lightning_ListChannels_0 = runtime.ForwardResponseMessage + forward_Lightning_SubscribeChannelEvents_0 = runtime.ForwardResponseStream + forward_Lightning_ClosedChannels_0 = runtime.ForwardResponseMessage forward_Lightning_OpenChannelSync_0 = runtime.ForwardResponseMessage + forward_Lightning_OpenChannel_0 = runtime.ForwardResponseStream + + forward_Lightning_FundingStateStep_0 = runtime.ForwardResponseMessage + forward_Lightning_CloseChannel_0 = runtime.ForwardResponseStream forward_Lightning_AbandonChannel_0 = runtime.ForwardResponseMessage @@ -1912,6 +4107,12 @@ var ( forward_Lightning_GetNetworkInfo_0 = runtime.ForwardResponseMessage + forward_Lightning_StopDaemon_0 = runtime.ForwardResponseMessage + + forward_Lightning_SubscribeChannelGraph_0 = runtime.ForwardResponseStream + + forward_Lightning_DebugLevel_0 = runtime.ForwardResponseMessage + forward_Lightning_FeeReport_0 = runtime.ForwardResponseMessage forward_Lightning_UpdateChannelPolicy_0 = runtime.ForwardResponseMessage @@ -1926,5 +4127,7 @@ var ( forward_Lightning_RestoreChannelBackups_0 = runtime.ForwardResponseMessage + forward_Lightning_SubscribeChannelBackups_0 = runtime.ForwardResponseStream + forward_Lightning_BakeMacaroon_0 = runtime.ForwardResponseMessage ) diff --git a/lnrpc/rpc.proto b/lnrpc/rpc.proto index 38203147f7..bd68114234 100644 --- a/lnrpc/rpc.proto +++ b/lnrpc/rpc.proto @@ -1,7 +1,5 @@ syntax = "proto3"; -import "google/api/annotations.proto"; - package lnrpc; option go_package = "github.com/lightningnetwork/lnd/lnrpc"; @@ -31,42 +29,25 @@ service Lightning { confirmed unspent outputs and all unconfirmed unspent outputs under control of the wallet. */ - rpc WalletBalance (WalletBalanceRequest) returns (WalletBalanceResponse) { - option (google.api.http) = { - get: "/v1/balance/blockchain" - }; - } + rpc WalletBalance (WalletBalanceRequest) returns (WalletBalanceResponse); /* lncli: `channelbalance` ChannelBalance returns the total funds available across all open channels in satoshis. */ - rpc ChannelBalance (ChannelBalanceRequest) - returns (ChannelBalanceResponse) { - option (google.api.http) = { - get: "/v1/balance/channels" - }; - } + rpc ChannelBalance (ChannelBalanceRequest) returns (ChannelBalanceResponse); /* lncli: `listchaintxns` GetTransactions returns a list describing all the known transactions relevant to the wallet. */ - rpc GetTransactions (GetTransactionsRequest) returns (TransactionDetails) { - option (google.api.http) = { - get: "/v1/transactions" - }; - } + rpc GetTransactions (GetTransactionsRequest) returns (TransactionDetails); /* lncli: `estimatefee` EstimateFee asks the chain backend to estimate the fee rate and total fees for a transaction that pays to multiple specified outputs. */ - rpc EstimateFee (EstimateFeeRequest) returns (EstimateFeeResponse) { - option (google.api.http) = { - get: "/v1/transactions/fee" - }; - } + rpc EstimateFee (EstimateFeeRequest) returns (EstimateFeeResponse); /* lncli: `sendcoins` SendCoins executes a request to send coins to a particular address. Unlike @@ -75,12 +56,7 @@ service Lightning { consult its fee model to determine a fee for the default confirmation target. */ - rpc SendCoins (SendCoinsRequest) returns (SendCoinsResponse) { - option (google.api.http) = { - post: "/v1/transactions" - body: "*" - }; - } + rpc SendCoins (SendCoinsRequest) returns (SendCoinsResponse); /* lncli: `listunspent` Deprecated, use walletrpc.ListUnspent instead. @@ -88,11 +64,7 @@ service Lightning { ListUnspent returns a list of all utxos spendable by the wallet with a number of confirmations between the specified minimum and maximum. */ - rpc ListUnspent (ListUnspentRequest) returns (ListUnspentResponse) { - option (google.api.http) = { - get: "/v1/utxos" - }; - } + rpc ListUnspent (ListUnspentRequest) returns (ListUnspentResponse); /* SubscribeTransactions creates a uni-directional stream from the server to @@ -113,23 +85,14 @@ service Lightning { /* lncli: `newaddress` NewAddress creates a new address under control of the local wallet. */ - rpc NewAddress (NewAddressRequest) returns (NewAddressResponse) { - option (google.api.http) = { - get: "/v1/newaddress" - }; - } + rpc NewAddress (NewAddressRequest) returns (NewAddressResponse); /* lncli: `signmessage` SignMessage signs a message with this node's private key. The returned signature string is `zbase32` encoded and pubkey recoverable, meaning that only the message digest and signature are needed for verification. */ - rpc SignMessage (SignMessageRequest) returns (SignMessageResponse) { - option (google.api.http) = { - post: "/v1/signmessage" - body: "*" - }; - } + rpc SignMessage (SignMessageRequest) returns (SignMessageResponse); /* lncli: `verifymessage` VerifyMessage verifies a signature over a msg. The signature must be @@ -137,45 +100,26 @@ service Lightning { channel database. In addition to returning the validity of the signature, VerifyMessage also returns the recovered pubkey from the signature. */ - rpc VerifyMessage (VerifyMessageRequest) returns (VerifyMessageResponse) { - option (google.api.http) = { - post: "/v1/verifymessage" - body: "*" - }; - } + rpc VerifyMessage (VerifyMessageRequest) returns (VerifyMessageResponse); /* lncli: `connect` ConnectPeer attempts to establish a connection to a remote peer. This is at the networking level, and is used for communication between nodes. This is distinct from establishing a channel with a peer. */ - rpc ConnectPeer (ConnectPeerRequest) returns (ConnectPeerResponse) { - option (google.api.http) = { - post: "/v1/peers" - body: "*" - }; - } + rpc ConnectPeer (ConnectPeerRequest) returns (ConnectPeerResponse); /* lncli: `disconnect` DisconnectPeer attempts to disconnect one peer from another identified by a given pubKey. In the case that we currently have a pending or active channel with the target peer, then this action will be not be allowed. */ - rpc DisconnectPeer (DisconnectPeerRequest) - returns (DisconnectPeerResponse) { - option (google.api.http) = { - delete: "/v1/peers/{pub_key}" - }; - } + rpc DisconnectPeer (DisconnectPeerRequest) returns (DisconnectPeerResponse); /* lncli: `listpeers` ListPeers returns a verbose listing of all currently active peers. */ - rpc ListPeers (ListPeersRequest) returns (ListPeersResponse) { - option (google.api.http) = { - get: "/v1/peers" - }; - } + rpc ListPeers (ListPeersRequest) returns (ListPeersResponse); /* SubscribePeerEvents creates a uni-directional stream from the server to @@ -189,11 +133,7 @@ service Lightning { it's identity pubkey, alias, the chains it is connected to, and information concerning the number of open+pending channels. */ - rpc GetInfo (GetInfoRequest) returns (GetInfoResponse) { - option (google.api.http) = { - get: "/v1/getinfo" - }; - } + rpc GetInfo (GetInfoRequest) returns (GetInfoResponse); // TODO(roasbeef): merge with below with bool? /* lncli: `pendingchannels` @@ -203,21 +143,13 @@ service Lightning { process of closure, either initiated cooperatively or non-cooperatively. */ rpc PendingChannels (PendingChannelsRequest) - returns (PendingChannelsResponse) { - option (google.api.http) = { - get: "/v1/channels/pending" - }; - } + returns (PendingChannelsResponse); /* lncli: `listchannels` ListChannels returns a description of all the open channels that this node is a participant in. */ - rpc ListChannels (ListChannelsRequest) returns (ListChannelsResponse) { - option (google.api.http) = { - get: "/v1/channels" - }; - } + rpc ListChannels (ListChannelsRequest) returns (ListChannelsResponse); /* SubscribeChannelEvents creates a uni-directional stream from the server to @@ -232,12 +164,7 @@ service Lightning { ClosedChannels returns a description of all the closed channels that this node was a participant in. */ - rpc ClosedChannels (ClosedChannelsRequest) - returns (ClosedChannelsResponse) { - option (google.api.http) = { - get: "/v1/channels/closed" - }; - } + rpc ClosedChannels (ClosedChannelsRequest) returns (ClosedChannelsResponse); /* OpenChannelSync is a synchronous version of the OpenChannel RPC call. This @@ -245,12 +172,7 @@ service Lightning { other sync calls, all byte slices are intended to be populated as hex encoded strings. */ - rpc OpenChannelSync (OpenChannelRequest) returns (ChannelPoint) { - option (google.api.http) = { - post: "/v1/channels" - body: "*" - }; - } + rpc OpenChannelSync (OpenChannelRequest) returns (ChannelPoint); /* lncli: `openchannel` OpenChannel attempts to open a singly funded channel specified in the @@ -295,11 +217,7 @@ service Lightning { closure transaction is confirmed, or a manual fee rate. If neither are specified, then a default lax, block confirmation target is used. */ - rpc CloseChannel (CloseChannelRequest) returns (stream CloseStatusUpdate) { - option (google.api.http) = { - delete: "/v1/channels/{channel_point.funding_txid_str}/{channel_point.output_index}" - }; - } + rpc CloseChannel (CloseChannelRequest) returns (stream CloseStatusUpdate); /* lncli: `abandonchannel` AbandonChannel removes all channel state from the database except for a @@ -307,12 +225,7 @@ service Lightning { channels due to bugs fixed in newer versions of lnd. Only available when in debug builds of lnd. */ - rpc AbandonChannel (AbandonChannelRequest) - returns (AbandonChannelResponse) { - option (google.api.http) = { - delete: "/v1/channels/abandon/{channel_point.funding_txid_str}/{channel_point.output_index}" - }; - } + rpc AbandonChannel (AbandonChannelRequest) returns (AbandonChannelResponse); /* lncli: `sendpayment` Deprecated, use routerrpc.SendPaymentV2. SendPayment dispatches a @@ -331,12 +244,7 @@ service Lightning { Additionally, this RPC expects the destination's public key and the payment hash (if any) to be encoded as hex strings. */ - rpc SendPaymentSync (SendRequest) returns (SendResponse) { - option (google.api.http) = { - post: "/v1/channels/transactions" - body: "*" - }; - } + rpc SendPaymentSync (SendRequest) returns (SendResponse); /* lncli: `sendtoroute` Deprecated, use routerrpc.SendToRouteV2. SendToRoute is a bi-directional @@ -353,24 +261,14 @@ service Lightning { SendToRouteSync is a synchronous version of SendToRoute. It Will block until the payment either fails or succeeds. */ - rpc SendToRouteSync (SendToRouteRequest) returns (SendResponse) { - option (google.api.http) = { - post: "/v1/channels/transactions/route" - body: "*" - }; - } + rpc SendToRouteSync (SendToRouteRequest) returns (SendResponse); /* lncli: `addinvoice` AddInvoice attempts to add a new invoice to the invoice database. Any duplicated invoices are rejected, therefore all invoices *must* have a unique payment preimage. */ - rpc AddInvoice (Invoice) returns (AddInvoiceResponse) { - option (google.api.http) = { - post: "/v1/invoices" - body: "*" - }; - } + rpc AddInvoice (Invoice) returns (AddInvoiceResponse); /* lncli: `listinvoices` ListInvoices returns a list of all the invoices currently stored within the @@ -381,22 +279,14 @@ service Lightning { next request. By default, the first 100 invoices created will be returned. Backwards pagination is also supported through the Reversed flag. */ - rpc ListInvoices (ListInvoiceRequest) returns (ListInvoiceResponse) { - option (google.api.http) = { - get: "/v1/invoices" - }; - } + rpc ListInvoices (ListInvoiceRequest) returns (ListInvoiceResponse); /* lncli: `lookupinvoice` LookupInvoice attempts to look up an invoice according to its payment hash. The passed payment hash *must* be exactly 32 bytes, if not, an error is returned. */ - rpc LookupInvoice (PaymentHash) returns (Invoice) { - option (google.api.http) = { - get: "/v1/invoice/{r_hash_str}" - }; - } + rpc LookupInvoice (PaymentHash) returns (Invoice); /* SubscribeInvoices returns a uni-directional stream (server -> client) for @@ -409,41 +299,25 @@ service Lightning { of these fields can be set. If no fields are set, then we'll only send out the latest add/settle events. */ - rpc SubscribeInvoices (InvoiceSubscription) returns (stream Invoice) { - option (google.api.http) = { - get: "/v1/invoices/subscribe" - }; - } + rpc SubscribeInvoices (InvoiceSubscription) returns (stream Invoice); /* lncli: `decodepayreq` DecodePayReq takes an encoded payment request string and attempts to decode it, returning a full description of the conditions encoded within the payment request. */ - rpc DecodePayReq (PayReqString) returns (PayReq) { - option (google.api.http) = { - get: "/v1/payreq/{pay_req}" - }; - } + rpc DecodePayReq (PayReqString) returns (PayReq); /* lncli: `listpayments` ListPayments returns a list of all outgoing payments. */ - rpc ListPayments (ListPaymentsRequest) returns (ListPaymentsResponse) { - option (google.api.http) = { - get: "/v1/payments" - }; - }; + rpc ListPayments (ListPaymentsRequest) returns (ListPaymentsResponse); /* DeleteAllPayments deletes all outgoing payments from DB. */ rpc DeleteAllPayments (DeleteAllPaymentsRequest) - returns (DeleteAllPaymentsResponse) { - option (google.api.http) = { - delete: "/v1/payments" - }; - }; + returns (DeleteAllPaymentsResponse); /* lncli: `describegraph` DescribeGraph returns a description of the latest graph state from the @@ -453,21 +327,13 @@ service Lightning { the node directional specific routing policy which includes: the time lock delta, fee information, etc. */ - rpc DescribeGraph (ChannelGraphRequest) returns (ChannelGraph) { - option (google.api.http) = { - get: "/v1/graph" - }; - } + rpc DescribeGraph (ChannelGraphRequest) returns (ChannelGraph); /* lncli: `getnodemetrics` GetNodeMetrics returns node metrics calculated from the graph. Currently the only supported metric is betweenness centrality of individual nodes. */ - rpc GetNodeMetrics (NodeMetricsRequest) returns (NodeMetricsResponse) { - option (google.api.http) = { - get: "/v1/graph/nodemetrics" - }; - } + rpc GetNodeMetrics (NodeMetricsRequest) returns (NodeMetricsResponse); /* lncli: `getchaninfo` GetChanInfo returns the latest authenticated network announcement for the @@ -475,21 +341,13 @@ service Lightning { uniquely identifies the location of transaction's funding output within the blockchain. */ - rpc GetChanInfo (ChanInfoRequest) returns (ChannelEdge) { - option (google.api.http) = { - get: "/v1/graph/edge/{chan_id}" - }; - } + rpc GetChanInfo (ChanInfoRequest) returns (ChannelEdge); /* lncli: `getnodeinfo` GetNodeInfo returns the latest advertised, aggregated, and authenticated channel information for the specified node identified by its public key. */ - rpc GetNodeInfo (NodeInfoRequest) returns (NodeInfo) { - option (google.api.http) = { - get: "/v1/graph/node/{pub_key}" - }; - } + rpc GetNodeInfo (NodeInfoRequest) returns (NodeInfo); /* lncli: `queryroutes` QueryRoutes attempts to query the daemon's Channel Router for a possible @@ -498,21 +356,13 @@ service Lightning { send an HTLC, also including the necessary information that should be present within the Sphinx packet encapsulated within the HTLC. */ - rpc QueryRoutes (QueryRoutesRequest) returns (QueryRoutesResponse) { - option (google.api.http) = { - get: "/v1/graph/routes/{pub_key}/{amt}" - }; - } + rpc QueryRoutes (QueryRoutesRequest) returns (QueryRoutesResponse); /* lncli: `getnetworkinfo` GetNetworkInfo returns some basic stats about the known channel graph from the point of view of the node. */ - rpc GetNetworkInfo (NetworkInfoRequest) returns (NetworkInfo) { - option (google.api.http) = { - get: "/v1/graph/info" - }; - } + rpc GetNetworkInfo (NetworkInfoRequest) returns (NetworkInfo); /* lncli: `stop` StopDaemon will send a shutdown request to the interrupt handler, triggering @@ -543,23 +393,14 @@ service Lightning { FeeReport allows the caller to obtain a report detailing the current fee schedule enforced by the node globally for each channel. */ - rpc FeeReport (FeeReportRequest) returns (FeeReportResponse) { - option (google.api.http) = { - get: "/v1/fees" - }; - } + rpc FeeReport (FeeReportRequest) returns (FeeReportResponse); /* lncli: `updatechanpolicy` UpdateChannelPolicy allows the caller to update the fee schedule and channel policies for all channels globally, or a particular channel. */ rpc UpdateChannelPolicy (PolicyUpdateRequest) - returns (PolicyUpdateResponse) { - option (google.api.http) = { - post: "/v1/chanpolicy" - body: "*" - }; - } + returns (PolicyUpdateResponse); /* lncli: `fwdinghistory` ForwardingHistory allows the caller to query the htlcswitch for a record of @@ -574,12 +415,7 @@ service Lightning { request to allow the caller to skip a series of records. */ rpc ForwardingHistory (ForwardingHistoryRequest) - returns (ForwardingHistoryResponse) { - option (google.api.http) = { - post: "/v1/switch" - body: "*" - }; - }; + returns (ForwardingHistoryResponse); /* lncli: `exportchanbackup` ExportChannelBackup attempts to return an encrypted static channel backup @@ -590,11 +426,7 @@ service Lightning { from the WalletUnlocker service. */ rpc ExportChannelBackup (ExportChannelBackupRequest) - returns (ChannelBackup) { - option (google.api.http) = { - get: "/v1/channels/backup/{chan_point.funding_txid_str}/{chan_point.output_index}" - }; - }; + returns (ChannelBackup); /* ExportAllChannelBackups returns static channel backups for all existing @@ -604,11 +436,7 @@ service Lightning { each channel. */ rpc ExportAllChannelBackups (ChanBackupExportRequest) - returns (ChanBackupSnapshot) { - option (google.api.http) = { - get: "/v1/channels/backup" - }; - }; + returns (ChanBackupSnapshot); /* VerifyChanBackup allows a caller to verify the integrity of a channel backup @@ -616,12 +444,7 @@ service Lightning { Specifying both will result in an error. */ rpc VerifyChanBackup (ChanBackupSnapshot) - returns (VerifyChanBackupResponse) { - option (google.api.http) = { - post: "/v1/channels/backup/verify" - body: "*" - }; - }; + returns (VerifyChanBackupResponse); /* lncli: `restorechanbackup` RestoreChannelBackups accepts a set of singular channel backups, or a @@ -630,12 +453,7 @@ service Lightning { new channel will be shown under listchannels, as well as pending channels. */ rpc RestoreChannelBackups (RestoreChanBackupRequest) - returns (RestoreBackupResponse) { - option (google.api.http) = { - post: "/v1/channels/backup/restore" - body: "*" - }; - }; + returns (RestoreBackupResponse); /* SubscribeChannelBackups allows a client to sub-subscribe to the most up to @@ -647,20 +465,14 @@ service Lightning { channel(s) removed. */ rpc SubscribeChannelBackups (ChannelBackupSubscription) - returns (stream ChanBackupSnapshot) { - }; + returns (stream ChanBackupSnapshot); /* lncli: `bakemacaroon` BakeMacaroon allows the creation of a new macaroon with custom read and write permissions. No first-party caveats are added since this can be done offline. */ - rpc BakeMacaroon (BakeMacaroonRequest) returns (BakeMacaroonResponse) { - option (google.api.http) = { - post: "/v1/macaroon" - body: "*" - }; - }; + rpc BakeMacaroon (BakeMacaroonRequest) returns (BakeMacaroonResponse); } message Utxo { diff --git a/lnrpc/rpc.swagger.json b/lnrpc/rpc.swagger.json index 41651f0417..584e5c56ea 100644 --- a/lnrpc/rpc.swagger.json +++ b/lnrpc/rpc.swagger.json @@ -4,10 +4,6 @@ "title": "rpc.proto", "version": "version not set" }, - "schemes": [ - "http", - "https" - ], "consumes": [ "application/json" ], @@ -25,6 +21,12 @@ "schema": { "$ref": "#/definitions/lnrpcWalletBalanceResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -42,6 +44,12 @@ "schema": { "$ref": "#/definitions/lnrpcChannelBalanceResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -59,6 +67,12 @@ "schema": { "$ref": "#/definitions/lnrpcListChannelsResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -112,6 +126,12 @@ "schema": { "$ref": "#/definitions/lnrpcChannelPoint" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -139,6 +159,12 @@ "schema": { "$ref": "#/definitions/lnrpcAbandonChannelResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -181,6 +207,12 @@ "schema": { "$ref": "#/definitions/lnrpcChanBackupSnapshot" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -198,6 +230,12 @@ "schema": { "$ref": "#/definitions/lnrpcRestoreBackupResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -215,6 +253,38 @@ ] } }, + "/v1/channels/backup/subscribe": { + "get": { + "summary": "SubscribeChannelBackups allows a client to sub-subscribe to the most up to\ndate information concerning the state of all channel backups. Each time a\nnew channel is added, we return the new set of channels, along with a\nmulti-chan backup containing the backup info for all channels. Each time a\nchannel is closed, we send a new update, which contains new new chan back\nups, but the updated set of encrypted multi-chan backups with the closed\nchannel(s) removed.", + "operationId": "SubscribeChannelBackups", + "responses": { + "200": { + "description": "A successful response.(streaming responses)", + "schema": { + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/lnrpcChanBackupSnapshot" + }, + "error": { + "$ref": "#/definitions/runtimeStreamError" + } + }, + "title": "Stream result of lnrpcChanBackupSnapshot" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "Lightning" + ] + } + }, "/v1/channels/backup/verify": { "post": { "summary": "VerifyChanBackup allows a caller to verify the integrity of a channel backup\nsnapshot. This method will accept either a packed Single or a packed Multi.\nSpecifying both will result in an error.", @@ -225,6 +295,12 @@ "schema": { "$ref": "#/definitions/lnrpcVerifyChanBackupResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -252,6 +328,12 @@ "schema": { "$ref": "#/definitions/lnrpcChannelBackup" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -294,6 +376,12 @@ "schema": { "$ref": "#/definitions/lnrpcClosedChannelsResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -355,6 +443,86 @@ "schema": { "$ref": "#/definitions/lnrpcPendingChannelsResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "Lightning" + ] + } + }, + "/v1/channels/stream": { + "post": { + "summary": "lncli: `openchannel`\nOpenChannel attempts to open a singly funded channel specified in the\nrequest to a remote peer. Users are able to specify a target number of\nblocks that the funding transaction should be confirmed in, or a manual fee\nrate to us for the funding transaction. If neither are specified, then a\nlax block confirmation target is used. Each OpenStatusUpdate will return\nthe pending channel ID of the in-progress channel. Depending on the\narguments specified in the OpenChannelRequest, this pending channel ID can\nthen be used to manually progress the channel funding flow.", + "operationId": "OpenChannel", + "responses": { + "200": { + "description": "A successful response.(streaming responses)", + "schema": { + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/lnrpcOpenStatusUpdate" + }, + "error": { + "$ref": "#/definitions/runtimeStreamError" + } + }, + "title": "Stream result of lnrpcOpenStatusUpdate" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/lnrpcOpenChannelRequest" + } + } + ], + "tags": [ + "Lightning" + ] + } + }, + "/v1/channels/subscribe": { + "get": { + "summary": "SubscribeChannelEvents creates a uni-directional stream from the server to\nthe client in which any updates relevant to the state of the channels are\nsent over. Events include new active channels, inactive channels, and closed\nchannels.", + "operationId": "SubscribeChannelEvents", + "responses": { + "200": { + "description": "A successful response.(streaming responses)", + "schema": { + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/lnrpcChannelEventUpdate" + }, + "error": { + "$ref": "#/definitions/runtimeStreamError" + } + }, + "title": "Stream result of lnrpcChannelEventUpdate" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -372,6 +540,12 @@ "schema": { "$ref": "#/definitions/lnrpcSendResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -399,6 +573,12 @@ "schema": { "$ref": "#/definitions/lnrpcSendResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -424,7 +604,22 @@ "200": { "description": "A successful response.(streaming responses)", "schema": { - "$ref": "#/x-stream-definitions/lnrpcCloseStatusUpdate" + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/lnrpcCloseStatusUpdate" + }, + "error": { + "$ref": "#/definitions/runtimeStreamError" + } + }, + "title": "Stream result of lnrpcCloseStatusUpdate" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" } } }, @@ -499,6 +694,12 @@ "schema": { "$ref": "#/definitions/lnrpcPolicyUpdateResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -516,6 +717,39 @@ ] } }, + "/v1/debuglevel": { + "post": { + "summary": "lncli: `debuglevel`\nDebugLevel allows a caller to programmatically set the logging verbosity of\nlnd. The logging can be targeted according to a coarse daemon-wide logging\nlevel, or in a granular fashion to specify the logging for a target\nsub-system.", + "operationId": "DebugLevel", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/lnrpcDebugLevelResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/lnrpcDebugLevelRequest" + } + } + ], + "tags": [ + "Lightning" + ] + } + }, "/v1/fees": { "get": { "summary": "lncli: `feereport`\nFeeReport allows the caller to obtain a report detailing the current fee\nschedule enforced by the node globally for each channel.", @@ -526,6 +760,12 @@ "schema": { "$ref": "#/definitions/lnrpcFeeReportResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -533,6 +773,39 @@ ] } }, + "/v1/funding/step": { + "post": { + "summary": "FundingStateStep is an advanced funding related call that allows the caller\nto either execute some preparatory steps for a funding workflow, or\nmanually progress a funding workflow. The primary way a funding flow is\nidentified is via its pending channel ID. As an example, this method can be\nused to specify that we're expecting a funding flow for a particular\npending channel ID, for which we need to use specific parameters.\nAlternatively, this can be used to interactively drive PSBT signing for\nfunding for partially complete funding transactions.", + "operationId": "FundingStateStep", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/lnrpcFundingStateStepResp" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/lnrpcFundingTransitionMsg" + } + } + ], + "tags": [ + "Lightning" + ] + } + }, "/v1/getinfo": { "get": { "summary": "lncli: `getinfo`\nGetInfo returns general information concerning the lightning node including\nit's identity pubkey, alias, the chains it is connected to, and information\nconcerning the number of open+pending channels.", @@ -543,6 +816,12 @@ "schema": { "$ref": "#/definitions/lnrpcGetInfoResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -560,6 +839,12 @@ "schema": { "$ref": "#/definitions/lnrpcChannelGraph" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -587,6 +872,12 @@ "schema": { "$ref": "#/definitions/lnrpcChannelEdge" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -614,6 +905,12 @@ "schema": { "$ref": "#/definitions/lnrpcNetworkInfo" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -631,6 +928,12 @@ "schema": { "$ref": "#/definitions/lnrpcNodeInfo" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -665,6 +968,12 @@ "schema": { "$ref": "#/definitions/lnrpcNodeMetricsResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -699,6 +1008,12 @@ "schema": { "$ref": "#/definitions/lnrpcQueryRoutesResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -844,6 +1159,38 @@ ] } }, + "/v1/graph/subscribe": { + "get": { + "summary": "SubscribeChannelGraph launches a streaming RPC that allows the caller to\nreceive notifications upon any changes to the channel graph topology from\nthe point of view of the responding node. Events notified include: new\nnodes coming online, nodes updating their authenticated attributes, new\nchannels being advertised, updates in the routing policy for a directional\nchannel edge, and when channels are closed on-chain.", + "operationId": "SubscribeChannelGraph", + "responses": { + "200": { + "description": "A successful response.(streaming responses)", + "schema": { + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/lnrpcGraphTopologyUpdate" + }, + "error": { + "$ref": "#/definitions/runtimeStreamError" + } + }, + "title": "Stream result of lnrpcGraphTopologyUpdate" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "Lightning" + ] + } + }, "/v1/invoice/{r_hash_str}": { "get": { "summary": "lncli: `lookupinvoice`\nLookupInvoice attempts to look up an invoice according to its payment hash.\nThe passed payment hash *must* be exactly 32 bytes, if not, an error is\nreturned.", @@ -854,6 +1201,12 @@ "schema": { "$ref": "#/definitions/lnrpcInvoice" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -888,6 +1241,12 @@ "schema": { "$ref": "#/definitions/lnrpcListInvoiceResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -937,6 +1296,12 @@ "schema": { "$ref": "#/definitions/lnrpcAddInvoiceResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -962,7 +1327,22 @@ "200": { "description": "A successful response.(streaming responses)", "schema": { - "$ref": "#/x-stream-definitions/lnrpcInvoice" + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/lnrpcInvoice" + }, + "error": { + "$ref": "#/definitions/runtimeStreamError" + } + }, + "title": "Stream result of lnrpcInvoice" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" } } }, @@ -999,6 +1379,12 @@ "schema": { "$ref": "#/definitions/lnrpcBakeMacaroonResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1026,6 +1412,12 @@ "schema": { "$ref": "#/definitions/lnrpcNewAddressResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1059,6 +1451,12 @@ "schema": { "$ref": "#/definitions/lnrpcListPaymentsResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1108,6 +1506,12 @@ "schema": { "$ref": "#/definitions/lnrpcDeleteAllPaymentsResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "tags": [ @@ -1125,6 +1529,12 @@ "schema": { "$ref": "#/definitions/lnrpcPayReq" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1151,6 +1561,12 @@ "schema": { "$ref": "#/definitions/lnrpcListPeersResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1176,6 +1592,12 @@ "schema": { "$ref": "#/definitions/lnrpcConnectPeerResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1193,6 +1615,38 @@ ] } }, + "/v1/peers/subscribe": { + "get": { + "summary": "SubscribePeerEvents creates a uni-directional stream from the server to\nthe client in which any events relevant to the state of peers are sent\nover. Events include peers going online and offline.", + "operationId": "SubscribePeerEvents", + "responses": { + "200": { + "description": "A successful response.(streaming responses)", + "schema": { + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/lnrpcPeerEvent" + }, + "error": { + "$ref": "#/definitions/runtimeStreamError" + } + }, + "title": "Stream result of lnrpcPeerEvent" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "Lightning" + ] + } + }, "/v1/peers/{pub_key}": { "delete": { "summary": "lncli: `disconnect`\nDisconnectPeer attempts to disconnect one peer from another identified by a\ngiven pubKey. In the case that we currently have a pending or active channel\nwith the target peer, then this action will be not be allowed.", @@ -1203,6 +1657,12 @@ "schema": { "$ref": "#/definitions/lnrpcDisconnectPeerResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1229,6 +1689,12 @@ "schema": { "$ref": "#/definitions/lnrpcSignMessageResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1246,6 +1712,39 @@ ] } }, + "/v1/stop": { + "post": { + "summary": "lncli: `stop`\nStopDaemon will send a shutdown request to the interrupt handler, triggering\na graceful shutdown of the daemon.", + "operationId": "StopDaemon", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/lnrpcStopResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/lnrpcStopRequest" + } + } + ], + "tags": [ + "Lightning" + ] + } + }, "/v1/switch": { "post": { "summary": "lncli: `fwdinghistory`\nForwardingHistory allows the caller to query the htlcswitch for a record of\nall HTLCs forwarded within the target time range, and integer offset\nwithin that time range. If no time-range is specified, then the first chunk\nof the past 24 hrs of forwarding history are returned.", @@ -1257,6 +1756,12 @@ "schema": { "$ref": "#/definitions/lnrpcForwardingHistoryResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1284,6 +1789,12 @@ "schema": { "$ref": "#/definitions/lnrpcTransactionDetails" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1317,6 +1828,12 @@ "schema": { "$ref": "#/definitions/lnrpcSendCoinsResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1344,6 +1861,12 @@ "schema": { "$ref": "#/definitions/lnrpcEstimateFeeResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1361,6 +1884,89 @@ ] } }, + "/v1/transactions/many": { + "post": { + "summary": "lncli: `sendmany`\nSendMany handles a request for a transaction that creates multiple specified\noutputs in parallel. If neither target_conf, or sat_per_byte are set, then\nthe internal wallet will consult its fee model to determine a fee for the\ndefault confirmation target.", + "operationId": "SendMany", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/lnrpcSendManyResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/lnrpcSendManyRequest" + } + } + ], + "tags": [ + "Lightning" + ] + } + }, + "/v1/transactions/subscribe": { + "get": { + "summary": "SubscribeTransactions creates a uni-directional stream from the server to\nthe client in which any newly discovered transactions relevant to the\nwallet are sent over.", + "operationId": "SubscribeTransactions", + "responses": { + "200": { + "description": "A successful response.(streaming responses)", + "schema": { + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/lnrpcTransaction" + }, + "error": { + "$ref": "#/definitions/runtimeStreamError" + } + }, + "title": "Stream result of lnrpcTransaction" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "start_height", + "description": "The height from which to list transactions, inclusive. If this value is\ngreater than end_height, transactions will be read in reverse.", + "in": "query", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "end_height", + "description": "The height until which to list transactions, inclusive. To include\nunconfirmed transactions, this value should be set to -1, which will\nreturn transactions from start_height until the current chain tip and\nunconfirmed transactions. If no end_height is provided, the call will\ndefault to this option.", + "in": "query", + "required": false, + "type": "integer", + "format": "int32" + } + ], + "tags": [ + "Lightning" + ] + } + }, "/v1/utxos": { "get": { "summary": "lncli: `listunspent`\nDeprecated, use walletrpc.ListUnspent instead.", @@ -1372,6 +1978,12 @@ "schema": { "$ref": "#/definitions/lnrpcListUnspentResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -1407,6 +2019,12 @@ "schema": { "$ref": "#/definitions/lnrpcVerifyMessageResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -2446,6 +3064,18 @@ "lnrpcConnectPeerResponse": { "type": "object" }, + "lnrpcDebugLevelRequest": { + "type": "object", + "properties": { + "show": { + "type": "boolean", + "format": "boolean" + }, + "level_spec": { + "type": "string" + } + } + }, "lnrpcDebugLevelResponse": { "type": "object", "properties": { @@ -2782,6 +3412,27 @@ "lnrpcFundingStateStepResp": { "type": "object" }, + "lnrpcFundingTransitionMsg": { + "type": "object", + "properties": { + "shim_register": { + "$ref": "#/definitions/lnrpcFundingShim", + "description": "The funding shim to register. This should be used before any\nchannel funding has began by the remote party, as it is intended as a\npreparatory step for the full channel funding." + }, + "shim_cancel": { + "$ref": "#/definitions/lnrpcFundingShimCancel", + "description": "Used to cancel an existing registered funding shim." + }, + "psbt_verify": { + "$ref": "#/definitions/lnrpcFundingPsbtVerify", + "description": "Used to continue a funding flow that was initiated to be executed\nthrough a PSBT. This step verifies that the PSBT contains the correct\noutputs to fund the channel." + }, + "psbt_finalize": { + "$ref": "#/definitions/lnrpcFundingPsbtFinalize", + "description": "Used to continue a funding flow that was initiated to be executed\nthrough a PSBT. This step finalizes the funded and signed PSBT, finishes\nnegotiation with the peer and finally publishes the resulting funding\ntransaction." + } + } + }, "lnrpcGetInfoResponse": { "type": "object", "properties": { @@ -4247,6 +4898,33 @@ } } }, + "lnrpcSendManyRequest": { + "type": "object", + "properties": { + "AddrToAmount": { + "type": "object", + "additionalProperties": { + "type": "string", + "format": "int64" + }, + "title": "The map from addresses to amounts" + }, + "target_conf": { + "type": "integer", + "format": "int32", + "description": "The target number of blocks that this transaction should be confirmed\nby." + }, + "sat_per_byte": { + "type": "string", + "format": "int64", + "description": "A manual fee rate set in sat/byte that should be used when crafting the\ntransaction." + }, + "label": { + "type": "string", + "description": "An optional label for the transaction, limited to 500 characters." + } + } + }, "lnrpcSendManyResponse": { "type": "object", "properties": { @@ -4393,6 +5071,9 @@ } } }, + "lnrpcStopRequest": { + "type": "object" + }, "lnrpcStopResponse": { "type": "object" }, @@ -4569,23 +5250,19 @@ } } }, - "runtimeStreamError": { + "runtimeError": { "type": "object", "properties": { - "grpc_code": { - "type": "integer", - "format": "int32" + "error": { + "type": "string" }, - "http_code": { + "code": { "type": "integer", "format": "int32" }, "message": { "type": "string" }, - "http_status": { - "type": "string" - }, "details": { "type": "array", "items": { @@ -4593,128 +5270,31 @@ } } } - } - }, - "x-stream-definitions": { - "lnrpcChanBackupSnapshot": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/lnrpcChanBackupSnapshot" - }, - "error": { - "$ref": "#/definitions/runtimeStreamError" - } - }, - "title": "Stream result of lnrpcChanBackupSnapshot" - }, - "lnrpcChannelAcceptRequest": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/lnrpcChannelAcceptRequest" - }, - "error": { - "$ref": "#/definitions/runtimeStreamError" - } - }, - "title": "Stream result of lnrpcChannelAcceptRequest" - }, - "lnrpcChannelEventUpdate": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/lnrpcChannelEventUpdate" - }, - "error": { - "$ref": "#/definitions/runtimeStreamError" - } - }, - "title": "Stream result of lnrpcChannelEventUpdate" - }, - "lnrpcCloseStatusUpdate": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/lnrpcCloseStatusUpdate" - }, - "error": { - "$ref": "#/definitions/runtimeStreamError" - } - }, - "title": "Stream result of lnrpcCloseStatusUpdate" - }, - "lnrpcGraphTopologyUpdate": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/lnrpcGraphTopologyUpdate" - }, - "error": { - "$ref": "#/definitions/runtimeStreamError" - } - }, - "title": "Stream result of lnrpcGraphTopologyUpdate" }, - "lnrpcInvoice": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/lnrpcInvoice" - }, - "error": { - "$ref": "#/definitions/runtimeStreamError" - } - }, - "title": "Stream result of lnrpcInvoice" - }, - "lnrpcOpenStatusUpdate": { + "runtimeStreamError": { "type": "object", "properties": { - "result": { - "$ref": "#/definitions/lnrpcOpenStatusUpdate" + "grpc_code": { + "type": "integer", + "format": "int32" }, - "error": { - "$ref": "#/definitions/runtimeStreamError" - } - }, - "title": "Stream result of lnrpcOpenStatusUpdate" - }, - "lnrpcPeerEvent": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/lnrpcPeerEvent" + "http_code": { + "type": "integer", + "format": "int32" }, - "error": { - "$ref": "#/definitions/runtimeStreamError" - } - }, - "title": "Stream result of lnrpcPeerEvent" - }, - "lnrpcSendResponse": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/lnrpcSendResponse" + "message": { + "type": "string" }, - "error": { - "$ref": "#/definitions/runtimeStreamError" - } - }, - "title": "Stream result of lnrpcSendResponse" - }, - "lnrpcTransaction": { - "type": "object", - "properties": { - "result": { - "$ref": "#/definitions/lnrpcTransaction" + "http_status": { + "type": "string" }, - "error": { - "$ref": "#/definitions/runtimeStreamError" + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } } - }, - "title": "Stream result of lnrpcTransaction" + } } } } diff --git a/lnrpc/signrpc/signer.pb.go b/lnrpc/signrpc/signer.pb.go index f4811bd7bb..f10416008c 100644 --- a/lnrpc/signrpc/signer.pb.go +++ b/lnrpc/signrpc/signer.pb.go @@ -8,6 +8,8 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" math "math" ) @@ -986,6 +988,26 @@ type SignerServer interface { DeriveSharedKey(context.Context, *SharedKeyRequest) (*SharedKeyResponse, error) } +// UnimplementedSignerServer can be embedded to have forward compatible implementations. +type UnimplementedSignerServer struct { +} + +func (*UnimplementedSignerServer) SignOutputRaw(ctx context.Context, req *SignReq) (*SignResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method SignOutputRaw not implemented") +} +func (*UnimplementedSignerServer) ComputeInputScript(ctx context.Context, req *SignReq) (*InputScriptResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method ComputeInputScript not implemented") +} +func (*UnimplementedSignerServer) SignMessage(ctx context.Context, req *SignMessageReq) (*SignMessageResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method SignMessage not implemented") +} +func (*UnimplementedSignerServer) VerifyMessage(ctx context.Context, req *VerifyMessageReq) (*VerifyMessageResp, error) { + return nil, status.Errorf(codes.Unimplemented, "method VerifyMessage not implemented") +} +func (*UnimplementedSignerServer) DeriveSharedKey(ctx context.Context, req *SharedKeyRequest) (*SharedKeyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeriveSharedKey not implemented") +} + func RegisterSignerServer(s *grpc.Server, srv SignerServer) { s.RegisterService(&_Signer_serviceDesc, srv) } diff --git a/lnrpc/signrpc/signer.pb.gw.go b/lnrpc/signrpc/signer.pb.gw.go new file mode 100644 index 0000000000..0247c1a04d --- /dev/null +++ b/lnrpc/signrpc/signer.pb.gw.go @@ -0,0 +1,475 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: signrpc/signer.proto + +/* +Package signrpc is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package signrpc + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage + +func request_Signer_SignOutputRaw_0(ctx context.Context, marshaler runtime.Marshaler, client SignerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SignReq + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.SignOutputRaw(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Signer_SignOutputRaw_0(ctx context.Context, marshaler runtime.Marshaler, server SignerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SignReq + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SignOutputRaw(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Signer_ComputeInputScript_0(ctx context.Context, marshaler runtime.Marshaler, client SignerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SignReq + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ComputeInputScript(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Signer_ComputeInputScript_0(ctx context.Context, marshaler runtime.Marshaler, server SignerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SignReq + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ComputeInputScript(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Signer_SignMessage_0(ctx context.Context, marshaler runtime.Marshaler, client SignerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SignMessageReq + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.SignMessage(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Signer_SignMessage_0(ctx context.Context, marshaler runtime.Marshaler, server SignerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SignMessageReq + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SignMessage(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Signer_VerifyMessage_0(ctx context.Context, marshaler runtime.Marshaler, client SignerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq VerifyMessageReq + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.VerifyMessage(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Signer_VerifyMessage_0(ctx context.Context, marshaler runtime.Marshaler, server SignerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq VerifyMessageReq + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.VerifyMessage(ctx, &protoReq) + return msg, metadata, err + +} + +func request_Signer_DeriveSharedKey_0(ctx context.Context, marshaler runtime.Marshaler, client SignerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SharedKeyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DeriveSharedKey(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Signer_DeriveSharedKey_0(ctx context.Context, marshaler runtime.Marshaler, server SignerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SharedKeyRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DeriveSharedKey(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterSignerHandlerServer registers the http handlers for service Signer to "mux". +// UnaryRPC :call SignerServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +func RegisterSignerHandlerServer(ctx context.Context, mux *runtime.ServeMux, server SignerServer) error { + + mux.Handle("POST", pattern_Signer_SignOutputRaw_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Signer_SignOutputRaw_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Signer_SignOutputRaw_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Signer_ComputeInputScript_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Signer_ComputeInputScript_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Signer_ComputeInputScript_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Signer_SignMessage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Signer_SignMessage_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Signer_SignMessage_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Signer_VerifyMessage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Signer_VerifyMessage_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Signer_VerifyMessage_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Signer_DeriveSharedKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Signer_DeriveSharedKey_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Signer_DeriveSharedKey_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterSignerHandlerFromEndpoint is same as RegisterSignerHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterSignerHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterSignerHandler(ctx, mux, conn) +} + +// RegisterSignerHandler registers the http handlers for service Signer to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterSignerHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterSignerHandlerClient(ctx, mux, NewSignerClient(conn)) +} + +// RegisterSignerHandlerClient registers the http handlers for service Signer +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "SignerClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "SignerClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "SignerClient" to call the correct interceptors. +func RegisterSignerHandlerClient(ctx context.Context, mux *runtime.ServeMux, client SignerClient) error { + + mux.Handle("POST", pattern_Signer_SignOutputRaw_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Signer_SignOutputRaw_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Signer_SignOutputRaw_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Signer_ComputeInputScript_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Signer_ComputeInputScript_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Signer_ComputeInputScript_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Signer_SignMessage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Signer_SignMessage_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Signer_SignMessage_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Signer_VerifyMessage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Signer_VerifyMessage_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Signer_VerifyMessage_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_Signer_DeriveSharedKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Signer_DeriveSharedKey_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Signer_DeriveSharedKey_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Signer_SignOutputRaw_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "signer", "signraw"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Signer_ComputeInputScript_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "signer", "inputscript"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Signer_SignMessage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "signer", "signmessage"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Signer_VerifyMessage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "signer", "verifymessage"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Signer_DeriveSharedKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "signer", "sharedkey"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_Signer_SignOutputRaw_0 = runtime.ForwardResponseMessage + + forward_Signer_ComputeInputScript_0 = runtime.ForwardResponseMessage + + forward_Signer_SignMessage_0 = runtime.ForwardResponseMessage + + forward_Signer_VerifyMessage_0 = runtime.ForwardResponseMessage + + forward_Signer_DeriveSharedKey_0 = runtime.ForwardResponseMessage +) diff --git a/lnrpc/signrpc/signer.swagger.json b/lnrpc/signrpc/signer.swagger.json index fabf1d9a7a..28439300da 100644 --- a/lnrpc/signrpc/signer.swagger.json +++ b/lnrpc/signrpc/signer.swagger.json @@ -4,18 +4,217 @@ "title": "signrpc/signer.proto", "version": "version not set" }, - "schemes": [ - "http", - "https" - ], "consumes": [ "application/json" ], "produces": [ "application/json" ], - "paths": {}, + "paths": { + "/v2/signer/inputscript": { + "post": { + "summary": "ComputeInputScript generates a complete InputIndex for the passed\ntransaction with the signature as defined within the passed SignDescriptor.\nThis method should be capable of generating the proper input script for\nboth regular p2wkh output and p2wkh outputs nested within a regular p2sh\noutput.", + "description": "Note that when using this method to sign inputs belonging to the wallet,\nthe only items of the SignDescriptor that need to be populated are pkScript\nin the TxOut field, the value in that same field, and finally the input\nindex.", + "operationId": "ComputeInputScript", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/signrpcInputScriptResp" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/signrpcSignReq" + } + } + ], + "tags": [ + "Signer" + ] + } + }, + "/v2/signer/sharedkey": { + "post": { + "summary": "DeriveSharedKey returns a shared secret key by performing Diffie-Hellman key\nderivation between the ephemeral public key in the request and the node's\nkey specified in the key_loc parameter (or the node's identity private key\nif no key locator is specified):\nP_shared = privKeyNode * ephemeralPubkey\nThe resulting shared public key is serialized in the compressed format and\nhashed with sha256, resulting in the final key length of 256bit.", + "operationId": "DeriveSharedKey", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/signrpcSharedKeyResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/signrpcSharedKeyRequest" + } + } + ], + "tags": [ + "Signer" + ] + } + }, + "/v2/signer/signmessage": { + "post": { + "summary": "SignMessage signs a message with the key specified in the key locator. The\nreturned signature is fixed-size LN wire format encoded.", + "description": "The main difference to SignMessage in the main RPC is that a specific key is\nused to sign the message instead of the node identity private key.", + "operationId": "SignMessage", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/signrpcSignMessageResp" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/signrpcSignMessageReq" + } + } + ], + "tags": [ + "Signer" + ] + } + }, + "/v2/signer/signraw": { + "post": { + "summary": "SignOutputRaw is a method that can be used to generated a signature for a\nset of inputs/outputs to a transaction. Each request specifies details\nconcerning how the outputs should be signed, which keys they should be\nsigned with, and also any optional tweaks. The return value is a fixed\n64-byte signature (the same format as we use on the wire in Lightning).", + "description": "If we are unable to sign using the specified keys, then an error will be\nreturned.", + "operationId": "SignOutputRaw", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/signrpcSignResp" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/signrpcSignReq" + } + } + ], + "tags": [ + "Signer" + ] + } + }, + "/v2/signer/verifymessage": { + "post": { + "summary": "VerifyMessage verifies a signature over a message using the public key\nprovided. The signature must be fixed-size LN wire format encoded.", + "description": "The main difference to VerifyMessage in the main RPC is that the public key\nused to sign the message does not have to be a node known to the network.", + "operationId": "VerifyMessage", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/signrpcVerifyMessageResp" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/signrpcVerifyMessageReq" + } + } + ], + "tags": [ + "Signer" + ] + } + } + }, "definitions": { + "protobufAny": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } + }, "signrpcInputScript": { "type": "object", "properties": { @@ -75,6 +274,20 @@ } } }, + "signrpcSharedKeyRequest": { + "type": "object", + "properties": { + "ephemeral_pubkey": { + "type": "string", + "format": "byte", + "description": "The ephemeral public key to use for the DH key derivation." + }, + "key_loc": { + "$ref": "#/definitions/signrpcKeyLocator", + "description": "The optional key locator of the local key that should be used. If this\nparameter is not set then the node's identity private key will be used." + } + } + }, "signrpcSharedKeyResponse": { "type": "object", "properties": { @@ -124,6 +337,20 @@ } } }, + "signrpcSignMessageReq": { + "type": "object", + "properties": { + "msg": { + "type": "string", + "format": "byte", + "description": "The message to be signed." + }, + "key_loc": { + "$ref": "#/definitions/signrpcKeyLocator", + "description": "The key locator that identifies which key to use for signing." + } + } + }, "signrpcSignMessageResp": { "type": "object", "properties": { @@ -134,6 +361,23 @@ } } }, + "signrpcSignReq": { + "type": "object", + "properties": { + "raw_tx_bytes": { + "type": "string", + "format": "byte", + "description": "The raw bytes of the transaction to be signed." + }, + "sign_descs": { + "type": "array", + "items": { + "$ref": "#/definitions/signrpcSignDescriptor" + }, + "description": "A set of sign descriptors, for each input to be signed." + } + } + }, "signrpcSignResp": { "type": "object", "properties": { @@ -162,6 +406,26 @@ } } }, + "signrpcVerifyMessageReq": { + "type": "object", + "properties": { + "msg": { + "type": "string", + "format": "byte", + "description": "The message over which the signature is to be verified." + }, + "signature": { + "type": "string", + "format": "byte", + "description": "The fixed-size LN wire encoded signature to be verified over the given\nmessage." + }, + "pubkey": { + "type": "string", + "format": "byte", + "description": "The public key the signature has to be valid for." + } + } + }, "signrpcVerifyMessageResp": { "type": "object", "properties": { diff --git a/lnrpc/signrpc/signer_server.go b/lnrpc/signrpc/signer_server.go index db56ac1374..fca12ad781 100644 --- a/lnrpc/signrpc/signer_server.go +++ b/lnrpc/signrpc/signer_server.go @@ -14,6 +14,7 @@ import ( "github.com/btcsuite/btcd/chaincfg/chainhash" "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/keychain" "github.com/lightningnetwork/lnd/lnrpc" @@ -174,6 +175,28 @@ func (s *Server) RegisterWithRootServer(grpcServer *grpc.Server) error { return nil } +// RegisterWithRestServer will be called by the root REST mux to direct a sub +// RPC server to register itself with the main REST mux server. Until this is +// called, each sub-server won't be able to have requests routed towards it. +// +// NOTE: This is part of the lnrpc.SubServer interface. +func (s *Server) RegisterWithRestServer(ctx context.Context, + mux *runtime.ServeMux, dest string, opts []grpc.DialOption) error { + + // We make sure that we register it with the main REST server to ensure + // all our methods are routed properly. + err := RegisterSignerHandlerFromEndpoint(ctx, mux, dest, opts) + if err != nil { + log.Errorf("Could not register Signer REST server "+ + "with root REST server: %v", err) + return err + } + + log.Debugf("Signer REST server successfully registered with " + + "root REST server") + return nil +} + // SignOutputRaw generates a signature for the passed transaction according to // the data within the passed SignReq. If we're unable to find the keys that // correspond to the KeyLocators in the SignReq then we'll return an error. diff --git a/lnrpc/sub_server.go b/lnrpc/sub_server.go index 1e58a2a634..7970273a9c 100644 --- a/lnrpc/sub_server.go +++ b/lnrpc/sub_server.go @@ -1,9 +1,11 @@ package lnrpc import ( + "context" "fmt" "sync" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "google.golang.org/grpc" "gopkg.in/macaroon-bakery.v2/bakery" ) @@ -36,6 +38,13 @@ type SubServer interface { // server. Until this is called, each sub-server won't be able to have // requests routed towards it. RegisterWithRootServer(*grpc.Server) error + + // RegisterWithRestServer will be called by the root REST mux to direct + // a sub RPC server to register itself with the main REST mux server. + // Until this is called, each sub-server won't be able to have requests + // routed towards it. + RegisterWithRestServer(context.Context, *runtime.ServeMux, string, + []grpc.DialOption) error } // SubServerConfigDispatcher is an interface that all sub-servers will use to diff --git a/lnrpc/verrpc/server.go b/lnrpc/verrpc/server.go index d11c61d1f7..ecbd29c1a3 100644 --- a/lnrpc/verrpc/server.go +++ b/lnrpc/verrpc/server.go @@ -3,6 +3,7 @@ package verrpc import ( "context" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/lightningnetwork/lnd/build" "google.golang.org/grpc" "gopkg.in/macaroon-bakery.v2/bakery" @@ -57,6 +58,28 @@ func (s *Server) RegisterWithRootServer(grpcServer *grpc.Server) error { return nil } +// RegisterWithRestServer will be called by the root REST mux to direct a sub +// RPC server to register itself with the main REST mux server. Until this is +// called, each sub-server won't be able to have requests routed towards it. +// +// NOTE: This is part of the lnrpc.SubServer interface. +func (s *Server) RegisterWithRestServer(ctx context.Context, + mux *runtime.ServeMux, dest string, opts []grpc.DialOption) error { + + // We make sure that we register it with the main REST server to ensure + // all our methods are routed properly. + err := RegisterVersionerHandlerFromEndpoint(ctx, mux, dest, opts) + if err != nil { + log.Errorf("Could not register Versioner REST server "+ + "with root REST server: %v", err) + return err + } + + log.Debugf("Versioner REST server successfully registered with " + + "root REST server") + return nil +} + // GetVersion returns information about the compiled binary. func (s *Server) GetVersion(_ context.Context, _ *VersionRequest) (*Version, error) { diff --git a/lnrpc/verrpc/verrpc.pb.go b/lnrpc/verrpc/verrpc.pb.go index f2634c66e9..674085c7b9 100644 --- a/lnrpc/verrpc/verrpc.pb.go +++ b/lnrpc/verrpc/verrpc.pb.go @@ -8,6 +8,8 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" math "math" ) @@ -238,6 +240,14 @@ type VersionerServer interface { GetVersion(context.Context, *VersionRequest) (*Version, error) } +// UnimplementedVersionerServer can be embedded to have forward compatible implementations. +type UnimplementedVersionerServer struct { +} + +func (*UnimplementedVersionerServer) GetVersion(ctx context.Context, req *VersionRequest) (*Version, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetVersion not implemented") +} + func RegisterVersionerServer(s *grpc.Server, srv VersionerServer) { s.RegisterService(&_Versioner_serviceDesc, srv) } diff --git a/lnrpc/verrpc/verrpc.pb.gw.go b/lnrpc/verrpc/verrpc.pb.gw.go new file mode 100644 index 0000000000..d6f6d59705 --- /dev/null +++ b/lnrpc/verrpc/verrpc.pb.gw.go @@ -0,0 +1,147 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: verrpc/verrpc.proto + +/* +Package verrpc is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package verrpc + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage + +func request_Versioner_GetVersion_0(ctx context.Context, marshaler runtime.Marshaler, client VersionerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq VersionRequest + var metadata runtime.ServerMetadata + + msg, err := client.GetVersion(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Versioner_GetVersion_0(ctx context.Context, marshaler runtime.Marshaler, server VersionerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq VersionRequest + var metadata runtime.ServerMetadata + + msg, err := server.GetVersion(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterVersionerHandlerServer registers the http handlers for service Versioner to "mux". +// UnaryRPC :call VersionerServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +func RegisterVersionerHandlerServer(ctx context.Context, mux *runtime.ServeMux, server VersionerServer) error { + + mux.Handle("GET", pattern_Versioner_GetVersion_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Versioner_GetVersion_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Versioner_GetVersion_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterVersionerHandlerFromEndpoint is same as RegisterVersionerHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterVersionerHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterVersionerHandler(ctx, mux, conn) +} + +// RegisterVersionerHandler registers the http handlers for service Versioner to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterVersionerHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterVersionerHandlerClient(ctx, mux, NewVersionerClient(conn)) +} + +// RegisterVersionerHandlerClient registers the http handlers for service Versioner +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "VersionerClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "VersionerClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "VersionerClient" to call the correct interceptors. +func RegisterVersionerHandlerClient(ctx context.Context, mux *runtime.ServeMux, client VersionerClient) error { + + mux.Handle("GET", pattern_Versioner_GetVersion_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Versioner_GetVersion_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Versioner_GetVersion_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Versioner_GetVersion_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "versioner", "version"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_Versioner_GetVersion_0 = runtime.ForwardResponseMessage +) diff --git a/lnrpc/verrpc/verrpc.swagger.json b/lnrpc/verrpc/verrpc.swagger.json index 52180e8149..67271dea63 100644 --- a/lnrpc/verrpc/verrpc.swagger.json +++ b/lnrpc/verrpc/verrpc.swagger.json @@ -4,18 +4,71 @@ "title": "verrpc/verrpc.proto", "version": "version not set" }, - "schemes": [ - "http", - "https" - ], "consumes": [ "application/json" ], "produces": [ "application/json" ], - "paths": {}, + "paths": { + "/v2/versioner/version": { + "get": { + "summary": "lncli: `version`\nGetVersion returns the current version and build information of the running\ndaemon.", + "operationId": "GetVersion", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/verrpcVersion" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "Versioner" + ] + } + } + }, "definitions": { + "protobufAny": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } + }, "verrpcVersion": { "type": "object", "properties": { diff --git a/lnrpc/walletrpc/walletkit.pb.go b/lnrpc/walletrpc/walletkit.pb.go index f775681f54..13d13c05e6 100644 --- a/lnrpc/walletrpc/walletkit.pb.go +++ b/lnrpc/walletrpc/walletkit.pb.go @@ -10,6 +10,8 @@ import ( lnrpc "github.com/lightningnetwork/lnd/lnrpc" signrpc "github.com/lightningnetwork/lnd/lnrpc/signrpc" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" math "math" ) @@ -1799,6 +1801,50 @@ type WalletKitServer interface { LabelTransaction(context.Context, *LabelTransactionRequest) (*LabelTransactionResponse, error) } +// UnimplementedWalletKitServer can be embedded to have forward compatible implementations. +type UnimplementedWalletKitServer struct { +} + +func (*UnimplementedWalletKitServer) ListUnspent(ctx context.Context, req *ListUnspentRequest) (*ListUnspentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListUnspent not implemented") +} +func (*UnimplementedWalletKitServer) LeaseOutput(ctx context.Context, req *LeaseOutputRequest) (*LeaseOutputResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method LeaseOutput not implemented") +} +func (*UnimplementedWalletKitServer) ReleaseOutput(ctx context.Context, req *ReleaseOutputRequest) (*ReleaseOutputResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ReleaseOutput not implemented") +} +func (*UnimplementedWalletKitServer) DeriveNextKey(ctx context.Context, req *KeyReq) (*signrpc.KeyDescriptor, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeriveNextKey not implemented") +} +func (*UnimplementedWalletKitServer) DeriveKey(ctx context.Context, req *signrpc.KeyLocator) (*signrpc.KeyDescriptor, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeriveKey not implemented") +} +func (*UnimplementedWalletKitServer) NextAddr(ctx context.Context, req *AddrRequest) (*AddrResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method NextAddr not implemented") +} +func (*UnimplementedWalletKitServer) PublishTransaction(ctx context.Context, req *Transaction) (*PublishResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PublishTransaction not implemented") +} +func (*UnimplementedWalletKitServer) SendOutputs(ctx context.Context, req *SendOutputsRequest) (*SendOutputsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method SendOutputs not implemented") +} +func (*UnimplementedWalletKitServer) EstimateFee(ctx context.Context, req *EstimateFeeRequest) (*EstimateFeeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EstimateFee not implemented") +} +func (*UnimplementedWalletKitServer) PendingSweeps(ctx context.Context, req *PendingSweepsRequest) (*PendingSweepsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PendingSweeps not implemented") +} +func (*UnimplementedWalletKitServer) BumpFee(ctx context.Context, req *BumpFeeRequest) (*BumpFeeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method BumpFee not implemented") +} +func (*UnimplementedWalletKitServer) ListSweeps(ctx context.Context, req *ListSweepsRequest) (*ListSweepsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListSweeps not implemented") +} +func (*UnimplementedWalletKitServer) LabelTransaction(ctx context.Context, req *LabelTransactionRequest) (*LabelTransactionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method LabelTransaction not implemented") +} + func RegisterWalletKitServer(s *grpc.Server, srv WalletKitServer) { s.RegisterService(&_WalletKit_serviceDesc, srv) } diff --git a/lnrpc/walletrpc/walletkit.pb.gw.go b/lnrpc/walletrpc/walletkit.pb.gw.go new file mode 100644 index 0000000000..8582dd8677 --- /dev/null +++ b/lnrpc/walletrpc/walletkit.pb.gw.go @@ -0,0 +1,1102 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: walletrpc/walletkit.proto + +/* +Package walletrpc is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package walletrpc + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "github.com/lightningnetwork/lnd/lnrpc/signrpc" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage + +var ( + filter_WalletKit_ListUnspent_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_WalletKit_ListUnspent_0(ctx context.Context, marshaler runtime.Marshaler, client WalletKitClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListUnspentRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_WalletKit_ListUnspent_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListUnspent(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WalletKit_ListUnspent_0(ctx context.Context, marshaler runtime.Marshaler, server WalletKitServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListUnspentRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_WalletKit_ListUnspent_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListUnspent(ctx, &protoReq) + return msg, metadata, err + +} + +func request_WalletKit_LeaseOutput_0(ctx context.Context, marshaler runtime.Marshaler, client WalletKitClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq LeaseOutputRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.LeaseOutput(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WalletKit_LeaseOutput_0(ctx context.Context, marshaler runtime.Marshaler, server WalletKitServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq LeaseOutputRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.LeaseOutput(ctx, &protoReq) + return msg, metadata, err + +} + +func request_WalletKit_ReleaseOutput_0(ctx context.Context, marshaler runtime.Marshaler, client WalletKitClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ReleaseOutputRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ReleaseOutput(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WalletKit_ReleaseOutput_0(ctx context.Context, marshaler runtime.Marshaler, server WalletKitServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ReleaseOutputRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ReleaseOutput(ctx, &protoReq) + return msg, metadata, err + +} + +func request_WalletKit_DeriveNextKey_0(ctx context.Context, marshaler runtime.Marshaler, client WalletKitClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq KeyReq + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DeriveNextKey(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WalletKit_DeriveNextKey_0(ctx context.Context, marshaler runtime.Marshaler, server WalletKitServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq KeyReq + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DeriveNextKey(ctx, &protoReq) + return msg, metadata, err + +} + +func request_WalletKit_DeriveKey_0(ctx context.Context, marshaler runtime.Marshaler, client WalletKitClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq signrpc.KeyLocator + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DeriveKey(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WalletKit_DeriveKey_0(ctx context.Context, marshaler runtime.Marshaler, server WalletKitServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq signrpc.KeyLocator + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DeriveKey(ctx, &protoReq) + return msg, metadata, err + +} + +func request_WalletKit_NextAddr_0(ctx context.Context, marshaler runtime.Marshaler, client WalletKitClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AddrRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.NextAddr(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WalletKit_NextAddr_0(ctx context.Context, marshaler runtime.Marshaler, server WalletKitServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AddrRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.NextAddr(ctx, &protoReq) + return msg, metadata, err + +} + +func request_WalletKit_PublishTransaction_0(ctx context.Context, marshaler runtime.Marshaler, client WalletKitClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq Transaction + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.PublishTransaction(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WalletKit_PublishTransaction_0(ctx context.Context, marshaler runtime.Marshaler, server WalletKitServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq Transaction + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.PublishTransaction(ctx, &protoReq) + return msg, metadata, err + +} + +func request_WalletKit_SendOutputs_0(ctx context.Context, marshaler runtime.Marshaler, client WalletKitClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SendOutputsRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.SendOutputs(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WalletKit_SendOutputs_0(ctx context.Context, marshaler runtime.Marshaler, server WalletKitServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq SendOutputsRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.SendOutputs(ctx, &protoReq) + return msg, metadata, err + +} + +func request_WalletKit_EstimateFee_0(ctx context.Context, marshaler runtime.Marshaler, client WalletKitClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq EstimateFeeRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["conf_target"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "conf_target") + } + + protoReq.ConfTarget, err = runtime.Int32(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "conf_target", err) + } + + msg, err := client.EstimateFee(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WalletKit_EstimateFee_0(ctx context.Context, marshaler runtime.Marshaler, server WalletKitServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq EstimateFeeRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["conf_target"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "conf_target") + } + + protoReq.ConfTarget, err = runtime.Int32(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "conf_target", err) + } + + msg, err := server.EstimateFee(ctx, &protoReq) + return msg, metadata, err + +} + +func request_WalletKit_PendingSweeps_0(ctx context.Context, marshaler runtime.Marshaler, client WalletKitClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PendingSweepsRequest + var metadata runtime.ServerMetadata + + msg, err := client.PendingSweeps(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WalletKit_PendingSweeps_0(ctx context.Context, marshaler runtime.Marshaler, server WalletKitServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PendingSweepsRequest + var metadata runtime.ServerMetadata + + msg, err := server.PendingSweeps(ctx, &protoReq) + return msg, metadata, err + +} + +func request_WalletKit_BumpFee_0(ctx context.Context, marshaler runtime.Marshaler, client WalletKitClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq BumpFeeRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.BumpFee(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WalletKit_BumpFee_0(ctx context.Context, marshaler runtime.Marshaler, server WalletKitServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq BumpFeeRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.BumpFee(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_WalletKit_ListSweeps_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_WalletKit_ListSweeps_0(ctx context.Context, marshaler runtime.Marshaler, client WalletKitClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListSweepsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_WalletKit_ListSweeps_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListSweeps(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WalletKit_ListSweeps_0(ctx context.Context, marshaler runtime.Marshaler, server WalletKitServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListSweepsRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_WalletKit_ListSweeps_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListSweeps(ctx, &protoReq) + return msg, metadata, err + +} + +func request_WalletKit_LabelTransaction_0(ctx context.Context, marshaler runtime.Marshaler, client WalletKitClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq LabelTransactionRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.LabelTransaction(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WalletKit_LabelTransaction_0(ctx context.Context, marshaler runtime.Marshaler, server WalletKitServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq LabelTransactionRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.LabelTransaction(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterWalletKitHandlerServer registers the http handlers for service WalletKit to "mux". +// UnaryRPC :call WalletKitServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +func RegisterWalletKitHandlerServer(ctx context.Context, mux *runtime.ServeMux, server WalletKitServer) error { + + mux.Handle("POST", pattern_WalletKit_ListUnspent_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WalletKit_ListUnspent_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_ListUnspent_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_LeaseOutput_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WalletKit_LeaseOutput_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_LeaseOutput_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_ReleaseOutput_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WalletKit_ReleaseOutput_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_ReleaseOutput_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_DeriveNextKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WalletKit_DeriveNextKey_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_DeriveNextKey_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_DeriveKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WalletKit_DeriveKey_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_DeriveKey_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_NextAddr_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WalletKit_NextAddr_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_NextAddr_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_PublishTransaction_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WalletKit_PublishTransaction_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_PublishTransaction_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_SendOutputs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WalletKit_SendOutputs_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_SendOutputs_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_WalletKit_EstimateFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WalletKit_EstimateFee_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_EstimateFee_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_WalletKit_PendingSweeps_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WalletKit_PendingSweeps_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_PendingSweeps_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_BumpFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WalletKit_BumpFee_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_BumpFee_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_WalletKit_ListSweeps_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WalletKit_ListSweeps_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_ListSweeps_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_LabelTransaction_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WalletKit_LabelTransaction_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_LabelTransaction_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterWalletKitHandlerFromEndpoint is same as RegisterWalletKitHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterWalletKitHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterWalletKitHandler(ctx, mux, conn) +} + +// RegisterWalletKitHandler registers the http handlers for service WalletKit to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterWalletKitHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterWalletKitHandlerClient(ctx, mux, NewWalletKitClient(conn)) +} + +// RegisterWalletKitHandlerClient registers the http handlers for service WalletKit +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "WalletKitClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "WalletKitClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "WalletKitClient" to call the correct interceptors. +func RegisterWalletKitHandlerClient(ctx context.Context, mux *runtime.ServeMux, client WalletKitClient) error { + + mux.Handle("POST", pattern_WalletKit_ListUnspent_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WalletKit_ListUnspent_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_ListUnspent_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_LeaseOutput_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WalletKit_LeaseOutput_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_LeaseOutput_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_ReleaseOutput_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WalletKit_ReleaseOutput_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_ReleaseOutput_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_DeriveNextKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WalletKit_DeriveNextKey_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_DeriveNextKey_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_DeriveKey_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WalletKit_DeriveKey_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_DeriveKey_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_NextAddr_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WalletKit_NextAddr_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_NextAddr_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_PublishTransaction_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WalletKit_PublishTransaction_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_PublishTransaction_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_SendOutputs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WalletKit_SendOutputs_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_SendOutputs_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_WalletKit_EstimateFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WalletKit_EstimateFee_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_EstimateFee_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_WalletKit_PendingSweeps_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WalletKit_PendingSweeps_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_PendingSweeps_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_BumpFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WalletKit_BumpFee_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_BumpFee_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_WalletKit_ListSweeps_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WalletKit_ListSweeps_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_ListSweeps_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletKit_LabelTransaction_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WalletKit_LabelTransaction_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletKit_LabelTransaction_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_WalletKit_ListUnspent_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "wallet", "utxos"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WalletKit_LeaseOutput_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "wallet", "utxos", "lease"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WalletKit_ReleaseOutput_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "wallet", "utxos", "release"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WalletKit_DeriveNextKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "wallet", "key", "next"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WalletKit_DeriveKey_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "wallet", "key"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WalletKit_NextAddr_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "wallet", "address", "next"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WalletKit_PublishTransaction_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "wallet", "tx"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WalletKit_SendOutputs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "wallet", "send"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WalletKit_EstimateFee_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "wallet", "estimatefee", "conf_target"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WalletKit_PendingSweeps_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "wallet", "sweeps", "pending"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WalletKit_BumpFee_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "wallet", "bumpfee"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WalletKit_ListSweeps_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "wallet", "sweeps"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WalletKit_LabelTransaction_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "wallet", "tx", "label"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_WalletKit_ListUnspent_0 = runtime.ForwardResponseMessage + + forward_WalletKit_LeaseOutput_0 = runtime.ForwardResponseMessage + + forward_WalletKit_ReleaseOutput_0 = runtime.ForwardResponseMessage + + forward_WalletKit_DeriveNextKey_0 = runtime.ForwardResponseMessage + + forward_WalletKit_DeriveKey_0 = runtime.ForwardResponseMessage + + forward_WalletKit_NextAddr_0 = runtime.ForwardResponseMessage + + forward_WalletKit_PublishTransaction_0 = runtime.ForwardResponseMessage + + forward_WalletKit_SendOutputs_0 = runtime.ForwardResponseMessage + + forward_WalletKit_EstimateFee_0 = runtime.ForwardResponseMessage + + forward_WalletKit_PendingSweeps_0 = runtime.ForwardResponseMessage + + forward_WalletKit_BumpFee_0 = runtime.ForwardResponseMessage + + forward_WalletKit_ListSweeps_0 = runtime.ForwardResponseMessage + + forward_WalletKit_LabelTransaction_0 = runtime.ForwardResponseMessage +) diff --git a/lnrpc/walletrpc/walletkit.swagger.json b/lnrpc/walletrpc/walletkit.swagger.json index d901a3945d..f133b2fe64 100644 --- a/lnrpc/walletrpc/walletkit.swagger.json +++ b/lnrpc/walletrpc/walletkit.swagger.json @@ -4,17 +4,425 @@ "title": "walletrpc/walletkit.proto", "version": "version not set" }, - "schemes": [ - "http", - "https" - ], "consumes": [ "application/json" ], "produces": [ "application/json" ], - "paths": {}, + "paths": { + "/v2/wallet/address/next": { + "post": { + "summary": "NextAddr returns the next unused address within the wallet.", + "operationId": "NextAddr", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/walletrpcAddrResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/walletrpcAddrRequest" + } + } + ], + "tags": [ + "WalletKit" + ] + } + }, + "/v2/wallet/bumpfee": { + "post": { + "summary": "BumpFee bumps the fee of an arbitrary input within a transaction. This RPC\ntakes a different approach than bitcoind's bumpfee command. lnd has a\ncentral batching engine in which inputs with similar fee rates are batched\ntogether to save on transaction fees. Due to this, we cannot rely on\nbumping the fee on a specific transaction, since transactions can change at\nany point with the addition of new inputs. The list of inputs that\ncurrently exist within lnd's central batching engine can be retrieved\nthrough the PendingSweeps RPC.", + "description": "When bumping the fee of an input that currently exists within lnd's central\nbatching engine, a higher fee transaction will be created that replaces the\nlower fee transaction through the Replace-By-Fee (RBF) policy. If it\n\nThis RPC also serves useful when wanting to perform a Child-Pays-For-Parent\n(CPFP), where the child transaction pays for its parent's fee. This can be\ndone by specifying an outpoint within the low fee transaction that is under\nthe control of the wallet.\n\nThe fee preference can be expressed either as a specific fee rate or a delta\nof blocks in which the output should be swept on-chain within. If a fee\npreference is not explicitly specified, then an error is returned.\n\nNote that this RPC currently doesn't perform any validation checks on the\nfee preference being provided. For now, the responsibility of ensuring that\nthe new fee preference is sufficient is delegated to the user.", + "operationId": "BumpFee", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/walletrpcBumpFeeResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/walletrpcBumpFeeRequest" + } + } + ], + "tags": [ + "WalletKit" + ] + } + }, + "/v2/wallet/estimatefee/{conf_target}": { + "get": { + "summary": "EstimateFee attempts to query the internal fee estimator of the wallet to\ndetermine the fee (in sat/kw) to attach to a transaction in order to\nachieve the confirmation target.", + "operationId": "EstimateFee", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/walletrpcEstimateFeeResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "conf_target", + "description": "The number of confirmations to shoot for when estimating the fee.", + "in": "path", + "required": true, + "type": "integer", + "format": "int32" + } + ], + "tags": [ + "WalletKit" + ] + } + }, + "/v2/wallet/key": { + "post": { + "summary": "DeriveKey attempts to derive an arbitrary key specified by the passed\nKeyLocator.", + "operationId": "DeriveKey", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/signrpcKeyDescriptor" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/signrpcKeyLocator" + } + } + ], + "tags": [ + "WalletKit" + ] + } + }, + "/v2/wallet/key/next": { + "post": { + "summary": "DeriveNextKey attempts to derive the *next* key within the key family\n(account in BIP43) specified. This method should return the next external\nchild within this branch.", + "operationId": "DeriveNextKey", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/signrpcKeyDescriptor" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/walletrpcKeyReq" + } + } + ], + "tags": [ + "WalletKit" + ] + } + }, + "/v2/wallet/send": { + "post": { + "summary": "SendOutputs is similar to the existing sendmany call in Bitcoind, and\nallows the caller to create a transaction that sends to several outputs at\nonce. This is ideal when wanting to batch create a set of transactions.", + "operationId": "SendOutputs", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/walletrpcSendOutputsResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/walletrpcSendOutputsRequest" + } + } + ], + "tags": [ + "WalletKit" + ] + } + }, + "/v2/wallet/sweeps": { + "get": { + "summary": "ListSweeps returns a list of the sweep transactions our node has produced.\nNote that these sweeps may not be confirmed yet, as we record sweeps on\nbroadcast, not confirmation.", + "operationId": "ListSweeps", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/walletrpcListSweepsResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "verbose", + "description": "Retrieve the full sweep transaction details. If false, only the sweep txids\nwill be returned.", + "in": "query", + "required": false, + "type": "boolean", + "format": "boolean" + } + ], + "tags": [ + "WalletKit" + ] + } + }, + "/v2/wallet/sweeps/pending": { + "get": { + "summary": "PendingSweeps returns lists of on-chain outputs that lnd is currently\nattempting to sweep within its central batching engine. Outputs with similar\nfee rates are batched together in order to sweep them within a single\ntransaction.", + "description": "NOTE: Some of the fields within PendingSweepsRequest are not guaranteed to\nremain supported. This is an advanced API that depends on the internals of\nthe UtxoSweeper, so things may change.", + "operationId": "PendingSweeps", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/walletrpcPendingSweepsResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "WalletKit" + ] + } + }, + "/v2/wallet/tx": { + "post": { + "summary": "PublishTransaction attempts to publish the passed transaction to the\nnetwork. Once this returns without an error, the wallet will continually\nattempt to re-broadcast the transaction on start up, until it enters the\nchain.", + "operationId": "PublishTransaction", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/walletrpcPublishResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/walletrpcTransaction" + } + } + ], + "tags": [ + "WalletKit" + ] + } + }, + "/v2/wallet/tx/label": { + "post": { + "summary": "LabelTransaction adds a label to a transaction. If the transaction already\nhas a label the call will fail unless the overwrite bool is set. This will\noverwrite the exiting transaction label. Labels must not be empty, and\ncannot exceed 500 characters.", + "operationId": "LabelTransaction", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/walletrpcLabelTransactionResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/walletrpcLabelTransactionRequest" + } + } + ], + "tags": [ + "WalletKit" + ] + } + }, + "/v2/wallet/utxos": { + "post": { + "summary": "ListUnspent returns a list of all utxos spendable by the wallet with a\nnumber of confirmations between the specified minimum and maximum.", + "operationId": "ListUnspent", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/walletrpcListUnspentResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "WalletKit" + ] + } + }, + "/v2/wallet/utxos/lease": { + "post": { + "summary": "LeaseOutput locks an output to the given ID, preventing it from being\navailable for any future coin selection attempts. The absolute time of the\nlock's expiration is returned. The expiration of the lock can be extended by\nsuccessive invocations of this RPC. Outputs can be unlocked before their\nexpiration through `ReleaseOutput`.", + "operationId": "LeaseOutput", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/walletrpcLeaseOutputResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/walletrpcLeaseOutputRequest" + } + } + ], + "tags": [ + "WalletKit" + ] + } + }, + "/v2/wallet/utxos/release": { + "post": { + "summary": "ReleaseOutput unlocks an output, allowing it to be available for coin\nselection if it remains unspent. The ID should match the one used to\noriginally lock the output.", + "operationId": "ReleaseOutput", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/walletrpcReleaseOutputResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/walletrpcReleaseOutputRequest" + } + } + ], + "tags": [ + "WalletKit" + ] + } + } + }, "definitions": { "ListSweepsResponseTransactionIDs": { "type": "object", @@ -155,6 +563,39 @@ } } }, + "protobufAny": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } + }, "signrpcKeyDescriptor": { "type": "object", "properties": { @@ -199,6 +640,9 @@ } } }, + "walletrpcAddrRequest": { + "type": "object" + }, "walletrpcAddrResponse": { "type": "object", "properties": { @@ -208,6 +652,30 @@ } } }, + "walletrpcBumpFeeRequest": { + "type": "object", + "properties": { + "outpoint": { + "$ref": "#/definitions/lnrpcOutPoint", + "description": "The input we're attempting to bump the fee of." + }, + "target_conf": { + "type": "integer", + "format": "int64", + "description": "The target number of blocks that the input should be spent within." + }, + "sat_per_byte": { + "type": "integer", + "format": "int64", + "description": "The fee rate, expressed in sat/byte, that should be used to spend the input\nwith." + }, + "force": { + "type": "boolean", + "format": "boolean", + "description": "Whether this input must be force-swept. This means that it is swept even\nif it has a negative yield." + } + } + }, "walletrpcBumpFeeResponse": { "type": "object" }, @@ -221,9 +689,57 @@ } } }, + "walletrpcKeyReq": { + "type": "object", + "properties": { + "key_finger_print": { + "type": "integer", + "format": "int32", + "description": "Is the key finger print of the root pubkey that this request is targeting.\nThis allows the WalletKit to possibly serve out keys for multiple HD chains\nvia public derivation." + }, + "key_family": { + "type": "integer", + "format": "int32", + "description": "The target key family to derive a key from. In other contexts, this is\nknown as the \"account\"." + } + } + }, + "walletrpcLabelTransactionRequest": { + "type": "object", + "properties": { + "txid": { + "type": "string", + "format": "byte", + "description": "The txid of the transaction to label." + }, + "label": { + "type": "string", + "description": "The label to add to the transaction, limited to 500 characters." + }, + "overwrite": { + "type": "boolean", + "format": "boolean", + "description": "Whether to overwrite the existing label, if it is present." + } + } + }, "walletrpcLabelTransactionResponse": { "type": "object" }, + "walletrpcLeaseOutputRequest": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "byte", + "description": "An ID of 32 random bytes that must be unique for each distinct application\nusing this RPC which will be used to bound the output lease to." + }, + "outpoint": { + "$ref": "#/definitions/lnrpcOutPoint", + "description": "The identifying outpoint of the output being leased." + } + } + }, "walletrpcLeaseOutputResponse": { "type": "object", "properties": { @@ -326,9 +842,44 @@ } } }, + "walletrpcReleaseOutputRequest": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "byte", + "description": "The unique ID that was used to lock the output." + }, + "outpoint": { + "$ref": "#/definitions/lnrpcOutPoint", + "description": "The identifying outpoint of the output being released." + } + } + }, "walletrpcReleaseOutputResponse": { "type": "object" }, + "walletrpcSendOutputsRequest": { + "type": "object", + "properties": { + "sat_per_kw": { + "type": "string", + "format": "int64", + "description": "The number of satoshis per kilo weight that should be used when crafting\nthis transaction." + }, + "outputs": { + "type": "array", + "items": { + "$ref": "#/definitions/signrpcTxOut" + }, + "description": "A slice of the outputs that should be created in the transaction produced." + }, + "label": { + "type": "string", + "description": "An optional label for the transaction, limited to 500 characters." + } + } + }, "walletrpcSendOutputsResponse": { "type": "object", "properties": { @@ -339,6 +890,20 @@ } } }, + "walletrpcTransaction": { + "type": "object", + "properties": { + "tx_hex": { + "type": "string", + "format": "byte", + "description": "The raw serialized transaction." + }, + "label": { + "type": "string", + "description": "An optional label to save with the transaction. Limited to 500 characters." + } + } + }, "walletrpcWitnessType": { "type": "string", "enum": [ diff --git a/lnrpc/walletrpc/walletkit_server.go b/lnrpc/walletrpc/walletkit_server.go index 0cd8ead02d..71a144f32c 100644 --- a/lnrpc/walletrpc/walletkit_server.go +++ b/lnrpc/walletrpc/walletkit_server.go @@ -15,6 +15,7 @@ import ( "github.com/btcsuite/btcd/txscript" "github.com/btcsuite/btcd/wire" "github.com/btcsuite/btcwallet/wtxmgr" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/keychain" "github.com/lightningnetwork/lnd/labels" @@ -217,6 +218,28 @@ func (w *WalletKit) RegisterWithRootServer(grpcServer *grpc.Server) error { return nil } +// RegisterWithRestServer will be called by the root REST mux to direct a sub +// RPC server to register itself with the main REST mux server. Until this is +// called, each sub-server won't be able to have requests routed towards it. +// +// NOTE: This is part of the lnrpc.SubServer interface. +func (w *WalletKit) RegisterWithRestServer(ctx context.Context, + mux *runtime.ServeMux, dest string, opts []grpc.DialOption) error { + + // We make sure that we register it with the main REST server to ensure + // all our methods are routed properly. + err := RegisterWalletKitHandlerFromEndpoint(ctx, mux, dest, opts) + if err != nil { + log.Errorf("Could not register WalletKit REST server "+ + "with root REST server: %v", err) + return err + } + + log.Debugf("WalletKit REST server successfully registered with " + + "root REST server") + return nil +} + // ListUnspent returns useful information about each unspent output owned by the // wallet, as reported by the underlying `ListUnspentWitness`; the information // returned is: outpoint, amount in satoshis, address, address type, diff --git a/lnrpc/walletunlocker.pb.go b/lnrpc/walletunlocker.pb.go index 4412952606..488b5becca 100644 --- a/lnrpc/walletunlocker.pb.go +++ b/lnrpc/walletunlocker.pb.go @@ -7,8 +7,9 @@ import ( context "context" fmt "fmt" proto "github.com/golang/protobuf/proto" - _ "google.golang.org/genproto/googleapis/api/annotations" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" math "math" ) @@ -463,45 +464,39 @@ func init() { func init() { proto.RegisterFile("walletunlocker.proto", fileDescriptor_76e3ed10ed53e4fd) } var fileDescriptor_76e3ed10ed53e4fd = []byte{ - // 595 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0xdf, 0x4a, 0xdc, 0x4e, - 0x14, 0x26, 0xbb, 0x3f, 0x7f, 0xc5, 0xe3, 0x36, 0xd1, 0x71, 0xb5, 0x31, 0x2a, 0xac, 0x81, 0xb2, - 0x5b, 0x0b, 0x9b, 0xd6, 0xde, 0x79, 0x69, 0x29, 0xa5, 0x17, 0x82, 0xac, 0x88, 0x50, 0x0a, 0xdb, - 0x98, 0x1c, 0x92, 0x60, 0x3c, 0x93, 0x4e, 0x66, 0x0d, 0xf6, 0xb2, 0x57, 0xbd, 0x2d, 0x7d, 0x8c, - 0x3e, 0x4e, 0x5f, 0xa1, 0x0f, 0x52, 0x32, 0x33, 0x71, 0xd5, 0xdd, 0x85, 0xb6, 0x77, 0xe1, 0x3b, - 0x7f, 0xbe, 0xf3, 0x7d, 0xe7, 0x64, 0xa0, 0x5b, 0x85, 0x79, 0x8e, 0x72, 0x42, 0x39, 0x8f, 0x2e, - 0x51, 0x0c, 0x0b, 0xc1, 0x25, 0x67, 0x4b, 0x39, 0x89, 0x22, 0xf2, 0x76, 0x12, 0xce, 0x93, 0x1c, - 0x83, 0xb0, 0xc8, 0x82, 0x90, 0x88, 0xcb, 0x50, 0x66, 0x9c, 0x4a, 0x9d, 0xe4, 0x2d, 0x8b, 0x22, - 0xd2, 0x9f, 0xfe, 0x47, 0xb0, 0xdf, 0x22, 0x9d, 0x22, 0xc6, 0x23, 0xfc, 0x34, 0xc1, 0x52, 0xb2, - 0xe7, 0xb0, 0x16, 0xe2, 0x67, 0xc4, 0x78, 0x5c, 0x84, 0x65, 0x59, 0xa4, 0x22, 0x2c, 0xd1, 0xb5, - 0x7a, 0xd6, 0xa0, 0x33, 0x5a, 0xd5, 0x81, 0x93, 0x5b, 0x9c, 0xed, 0x41, 0xa7, 0xac, 0x53, 0x91, - 0xa4, 0xe0, 0xc5, 0x8d, 0xdb, 0x52, 0x79, 0x2b, 0x35, 0xf6, 0x46, 0x43, 0x7e, 0x0e, 0xce, 0x2d, - 0x43, 0x59, 0x70, 0x2a, 0x91, 0xbd, 0x80, 0x6e, 0x94, 0x15, 0x29, 0x8a, 0xb1, 0x2a, 0xbe, 0x22, - 0xbc, 0xe2, 0x94, 0x45, 0xae, 0xd5, 0x6b, 0x0f, 0x96, 0x47, 0x4c, 0xc7, 0xea, 0x8a, 0x63, 0x13, - 0x61, 0x7d, 0x70, 0x90, 0x34, 0x8e, 0xb1, 0xaa, 0x32, 0x54, 0xf6, 0x14, 0xae, 0x0b, 0xfc, 0xaf, - 0x2d, 0x58, 0x7b, 0x47, 0x99, 0x3c, 0x57, 0xe6, 0x34, 0x9a, 0xfa, 0xe0, 0x68, 0xb7, 0x94, 0xa6, - 0x8a, 0x8b, 0xd8, 0x28, 0xb2, 0x35, 0x7c, 0x62, 0xd0, 0x85, 0x93, 0xb5, 0x16, 0x4e, 0x36, 0xd7, - 0xae, 0xf6, 0x02, 0xbb, 0xfa, 0xe0, 0x08, 0x8c, 0xf8, 0x35, 0x8a, 0x9b, 0x71, 0x95, 0x51, 0xcc, - 0x2b, 0xf7, 0xbf, 0x9e, 0x35, 0x58, 0x1a, 0xd9, 0x0d, 0x7c, 0xae, 0x50, 0x76, 0x04, 0x4e, 0x94, - 0x86, 0x44, 0x98, 0x8f, 0x2f, 0xc2, 0xe8, 0x72, 0x52, 0x94, 0xee, 0x52, 0xcf, 0x1a, 0xac, 0x1c, - 0x6c, 0x0d, 0xd5, 0x82, 0x87, 0xaf, 0xd3, 0x90, 0x8e, 0x54, 0xe4, 0x94, 0xc2, 0xa2, 0x4c, 0xb9, - 0x1c, 0xd9, 0xa6, 0x42, 0xc3, 0xa5, 0xdf, 0x05, 0x76, 0xd7, 0x09, 0xed, 0xbd, 0xff, 0xc3, 0x82, - 0xf5, 0x33, 0x75, 0x33, 0xff, 0x68, 0xd1, 0x1c, 0x0d, 0xad, 0x3f, 0xd5, 0xd0, 0xfe, 0x5b, 0x0d, - 0x9b, 0xd0, 0xbd, 0x3f, 0xac, 0x51, 0x81, 0xb0, 0x51, 0x57, 0x27, 0xd8, 0x8c, 0xd5, 0xc8, 0x78, - 0x06, 0xab, 0xd1, 0x44, 0x08, 0xa4, 0x19, 0x1d, 0x8e, 0xc1, 0x6f, 0x85, 0xec, 0x41, 0x87, 0xb0, - 0x9a, 0xa6, 0x99, 0xdb, 0x25, 0xac, 0x9a, 0x14, 0xdf, 0x85, 0xcd, 0x87, 0x34, 0x7a, 0x80, 0x83, - 0x6f, 0x6d, 0xb0, 0xf5, 0x4c, 0x67, 0xe6, 0x07, 0x64, 0xc7, 0xf0, 0xc8, 0x1c, 0x3a, 0xdb, 0x30, - 0x0a, 0xef, 0xff, 0x5a, 0xde, 0xe6, 0x43, 0xd8, 0xa8, 0x59, 0xff, 0xf2, 0xf3, 0xd7, 0xf7, 0xd6, - 0x63, 0xb6, 0x12, 0x5c, 0xbf, 0x0c, 0x12, 0xa4, 0xfa, 0xf6, 0xd8, 0x07, 0x80, 0xe9, 0xfa, 0x98, - 0x6b, 0x4a, 0x67, 0x6e, 0xdb, 0xdb, 0x9a, 0x13, 0x31, 0x7d, 0xb7, 0x54, 0xdf, 0x75, 0xdf, 0xae, - 0xfb, 0x66, 0x94, 0x49, 0xbd, 0xca, 0x43, 0x6b, 0x9f, 0xc5, 0xd0, 0xb9, 0x6b, 0x2c, 0xf3, 0x4c, - 0x97, 0x39, 0xa7, 0xe1, 0x6d, 0xcf, 0x8d, 0x19, 0x8e, 0x6d, 0xc5, 0xb1, 0xe1, 0xaf, 0xd6, 0x1c, - 0xfa, 0x31, 0x9a, 0xb2, 0xe4, 0x60, 0xdf, 0xf7, 0x8f, 0xed, 0xdc, 0xd9, 0xfd, 0xcc, 0xf6, 0xbc, - 0xdd, 0x05, 0x51, 0xc3, 0xb5, 0xab, 0xb8, 0x9e, 0xf8, 0xac, 0xe6, 0x8a, 0x54, 0x4e, 0xb3, 0xbd, - 0x43, 0x6b, 0xff, 0xa8, 0xff, 0xfe, 0x69, 0x92, 0xc9, 0x74, 0x72, 0x31, 0x8c, 0xf8, 0x55, 0x90, - 0x67, 0x49, 0x2a, 0x29, 0xa3, 0x84, 0x50, 0x56, 0x5c, 0x5c, 0x06, 0x39, 0xc5, 0x81, 0x6a, 0x7f, - 0xf1, 0xbf, 0x7a, 0xfb, 0x5e, 0xfd, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x9c, 0xfa, 0x8d, 0x9e, 0x43, - 0x05, 0x00, 0x00, + // 510 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0x4f, 0x6b, 0xdb, 0x4e, + 0x10, 0x45, 0xf6, 0xcf, 0xbf, 0x92, 0x89, 0x91, 0x92, 0xad, 0x63, 0x14, 0xb5, 0x05, 0x47, 0x50, + 0xec, 0x52, 0xb0, 0x4b, 0x7a, 0xe9, 0xb5, 0x2e, 0x25, 0xf4, 0x10, 0x08, 0x0e, 0x21, 0xd0, 0x8b, + 0x2b, 0x4b, 0x83, 0x25, 0x2c, 0xcf, 0x6e, 0x77, 0xe5, 0x8a, 0xf4, 0x13, 0xf4, 0x8b, 0xf4, 0xd4, + 0x2f, 0x59, 0xbc, 0xbb, 0xfe, 0x17, 0xcb, 0xd0, 0xf6, 0xfa, 0xde, 0xbc, 0xdd, 0x79, 0x6f, 0x66, + 0x17, 0x5a, 0x65, 0x94, 0xe7, 0x58, 0x2c, 0x28, 0xe7, 0xf1, 0x0c, 0x65, 0x5f, 0x48, 0x5e, 0x70, + 0xd6, 0xc8, 0x49, 0x8a, 0x38, 0x38, 0x92, 0x22, 0x36, 0x48, 0xf8, 0x05, 0xdc, 0x2b, 0xa4, 0x5b, + 0xc4, 0x64, 0x84, 0x5f, 0x17, 0xa8, 0x0a, 0xf6, 0x1a, 0x4e, 0x23, 0xfc, 0x8e, 0x98, 0x8c, 0x45, + 0xa4, 0x94, 0x48, 0x65, 0xa4, 0xd0, 0x77, 0x3a, 0x4e, 0xaf, 0x39, 0x3a, 0x31, 0xc4, 0xcd, 0x1a, + 0x67, 0x17, 0xd0, 0x54, 0xcb, 0x52, 0xa4, 0x42, 0x72, 0xf1, 0xe0, 0xd7, 0x74, 0xdd, 0xf1, 0x12, + 0xfb, 0x68, 0xa0, 0x30, 0x07, 0x6f, 0x7d, 0x83, 0x12, 0x9c, 0x14, 0xb2, 0x37, 0xd0, 0x8a, 0x33, + 0x91, 0xa2, 0x1c, 0x6b, 0xf1, 0x9c, 0x70, 0xce, 0x29, 0x8b, 0x7d, 0xa7, 0x53, 0xef, 0x1d, 0x8d, + 0x98, 0xe1, 0x96, 0x8a, 0x6b, 0xcb, 0xb0, 0x2e, 0x78, 0x48, 0x06, 0xc7, 0x44, 0xab, 0xec, 0x55, + 0xee, 0x06, 0x5e, 0x0a, 0xc2, 0x1f, 0x35, 0x38, 0xfd, 0x44, 0x59, 0x71, 0xaf, 0xed, 0xaf, 0x3c, + 0x75, 0xc1, 0x33, 0x79, 0x68, 0x4f, 0x25, 0x97, 0x89, 0x75, 0xe4, 0x1a, 0xf8, 0xc6, 0xa2, 0x07, + 0x3b, 0xab, 0x1d, 0xec, 0xac, 0x32, 0xae, 0xfa, 0x81, 0xb8, 0xba, 0xe0, 0x49, 0x8c, 0xf9, 0x37, + 0x94, 0x0f, 0xe3, 0x32, 0xa3, 0x84, 0x97, 0xfe, 0x7f, 0x1d, 0xa7, 0xd7, 0x18, 0xb9, 0x2b, 0xf8, + 0x5e, 0xa3, 0x6c, 0x08, 0x5e, 0x9c, 0x46, 0x44, 0x98, 0x8f, 0x27, 0x51, 0x3c, 0x5b, 0x08, 0xe5, + 0x37, 0x3a, 0x4e, 0xef, 0xf8, 0xf2, 0xbc, 0xaf, 0x47, 0xd8, 0xff, 0x90, 0x46, 0x34, 0xd4, 0xcc, + 0x2d, 0x45, 0x42, 0xa5, 0xbc, 0x18, 0xb9, 0x56, 0x61, 0x60, 0x15, 0xb6, 0x80, 0x6d, 0x27, 0x61, + 0xb2, 0x0f, 0x7f, 0x39, 0xf0, 0xf4, 0x4e, 0x6f, 0xc5, 0x3f, 0x46, 0x54, 0xe1, 0xa1, 0xf6, 0xa7, + 0x1e, 0xea, 0x7f, 0xeb, 0xa1, 0x0d, 0xad, 0xdd, 0x66, 0xad, 0x0b, 0x84, 0xb3, 0xa5, 0x7a, 0x8a, + 0xab, 0xb6, 0x56, 0x36, 0x5e, 0xc1, 0x49, 0xbc, 0x90, 0x12, 0x69, 0xcf, 0x87, 0x67, 0xf1, 0xb5, + 0x91, 0x0b, 0x68, 0x12, 0x96, 0x9b, 0x32, 0xbb, 0xbb, 0x84, 0xe5, 0xaa, 0x24, 0xf4, 0xa1, 0xfd, + 0xf8, 0x1a, 0xd3, 0xc0, 0xe5, 0xcf, 0x1a, 0xb8, 0xa6, 0xa7, 0x3b, 0xfb, 0xc4, 0xd8, 0x3b, 0x78, + 0x62, 0x17, 0x9d, 0x9d, 0x59, 0x87, 0xbb, 0x4f, 0x2b, 0x68, 0x3f, 0x86, 0xed, 0x7b, 0x78, 0x0f, + 0xb0, 0x99, 0x14, 0xf3, 0x6d, 0xd5, 0xde, 0x1a, 0x07, 0xe7, 0x15, 0x8c, 0x3d, 0xe2, 0x0a, 0x9a, + 0xdb, 0x41, 0xb1, 0xc0, 0x96, 0x56, 0x8c, 0x3a, 0x78, 0x56, 0xc9, 0xd9, 0x83, 0xae, 0xc1, 0xdd, + 0xb5, 0xcc, 0x9e, 0x6f, 0x8d, 0x6b, 0x2f, 0xf0, 0xe0, 0xc5, 0x01, 0xd6, 0x1c, 0x37, 0xec, 0x7e, + 0x7e, 0x39, 0xcd, 0x8a, 0x74, 0x31, 0xe9, 0xc7, 0x7c, 0x3e, 0xc8, 0xb3, 0x69, 0x5a, 0x50, 0x46, + 0x53, 0xc2, 0xa2, 0xe4, 0x72, 0x36, 0xc8, 0x29, 0x19, 0x68, 0xfd, 0xe4, 0x7f, 0xfd, 0x1f, 0xbd, + 0xfd, 0x1d, 0x00, 0x00, 0xff, 0xff, 0x94, 0x54, 0xe3, 0x28, 0xb9, 0x04, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -630,6 +625,23 @@ type WalletUnlockerServer interface { ChangePassword(context.Context, *ChangePasswordRequest) (*ChangePasswordResponse, error) } +// UnimplementedWalletUnlockerServer can be embedded to have forward compatible implementations. +type UnimplementedWalletUnlockerServer struct { +} + +func (*UnimplementedWalletUnlockerServer) GenSeed(ctx context.Context, req *GenSeedRequest) (*GenSeedResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GenSeed not implemented") +} +func (*UnimplementedWalletUnlockerServer) InitWallet(ctx context.Context, req *InitWalletRequest) (*InitWalletResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method InitWallet not implemented") +} +func (*UnimplementedWalletUnlockerServer) UnlockWallet(ctx context.Context, req *UnlockWalletRequest) (*UnlockWalletResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UnlockWallet not implemented") +} +func (*UnimplementedWalletUnlockerServer) ChangePassword(ctx context.Context, req *ChangePasswordRequest) (*ChangePasswordResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChangePassword not implemented") +} + func RegisterWalletUnlockerServer(s *grpc.Server, srv WalletUnlockerServer) { s.RegisterService(&_WalletUnlocker_serviceDesc, srv) } diff --git a/lnrpc/walletunlocker.pb.gw.go b/lnrpc/walletunlocker.pb.gw.go index 1cb944ec42..06a0ce9015 100644 --- a/lnrpc/walletunlocker.pb.gw.go +++ b/lnrpc/walletunlocker.pb.gw.go @@ -13,6 +13,7 @@ import ( "io" "net/http" + "github.com/golang/protobuf/descriptor" "github.com/golang/protobuf/proto" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/utilities" @@ -22,11 +23,13 @@ import ( "google.golang.org/grpc/status" ) +// Suppress "imported and not used" errors var _ codes.Code var _ io.Reader var _ status.Status var _ = runtime.String var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage var ( filter_WalletUnlocker_GenSeed_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} @@ -36,7 +39,10 @@ func request_WalletUnlocker_GenSeed_0(ctx context.Context, marshaler runtime.Mar var protoReq GenSeedRequest var metadata runtime.ServerMetadata - if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_WalletUnlocker_GenSeed_0); err != nil { + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_WalletUnlocker_GenSeed_0); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -45,6 +51,19 @@ func request_WalletUnlocker_GenSeed_0(ctx context.Context, marshaler runtime.Mar } +func local_request_WalletUnlocker_GenSeed_0(ctx context.Context, marshaler runtime.Marshaler, server WalletUnlockerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GenSeedRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_WalletUnlocker_GenSeed_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GenSeed(ctx, &protoReq) + return msg, metadata, err + +} + func request_WalletUnlocker_InitWallet_0(ctx context.Context, marshaler runtime.Marshaler, client WalletUnlockerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq InitWalletRequest var metadata runtime.ServerMetadata @@ -62,6 +81,23 @@ func request_WalletUnlocker_InitWallet_0(ctx context.Context, marshaler runtime. } +func local_request_WalletUnlocker_InitWallet_0(ctx context.Context, marshaler runtime.Marshaler, server WalletUnlockerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq InitWalletRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.InitWallet(ctx, &protoReq) + return msg, metadata, err + +} + func request_WalletUnlocker_UnlockWallet_0(ctx context.Context, marshaler runtime.Marshaler, client WalletUnlockerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq UnlockWalletRequest var metadata runtime.ServerMetadata @@ -79,6 +115,23 @@ func request_WalletUnlocker_UnlockWallet_0(ctx context.Context, marshaler runtim } +func local_request_WalletUnlocker_UnlockWallet_0(ctx context.Context, marshaler runtime.Marshaler, server WalletUnlockerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UnlockWalletRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.UnlockWallet(ctx, &protoReq) + return msg, metadata, err + +} + func request_WalletUnlocker_ChangePassword_0(ctx context.Context, marshaler runtime.Marshaler, client WalletUnlockerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq ChangePasswordRequest var metadata runtime.ServerMetadata @@ -96,6 +149,111 @@ func request_WalletUnlocker_ChangePassword_0(ctx context.Context, marshaler runt } +func local_request_WalletUnlocker_ChangePassword_0(ctx context.Context, marshaler runtime.Marshaler, server WalletUnlockerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ChangePasswordRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ChangePassword(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterWalletUnlockerHandlerServer registers the http handlers for service WalletUnlocker to "mux". +// UnaryRPC :call WalletUnlockerServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +func RegisterWalletUnlockerHandlerServer(ctx context.Context, mux *runtime.ServeMux, server WalletUnlockerServer) error { + + mux.Handle("GET", pattern_WalletUnlocker_GenSeed_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WalletUnlocker_GenSeed_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletUnlocker_GenSeed_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletUnlocker_InitWallet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WalletUnlocker_InitWallet_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletUnlocker_InitWallet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletUnlocker_UnlockWallet_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WalletUnlocker_UnlockWallet_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletUnlocker_UnlockWallet_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_WalletUnlocker_ChangePassword_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WalletUnlocker_ChangePassword_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WalletUnlocker_ChangePassword_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + // RegisterWalletUnlockerHandlerFromEndpoint is same as RegisterWalletUnlockerHandler but // automatically dials to "endpoint" and closes the connection when "ctx" gets done. func RegisterWalletUnlockerHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { @@ -218,13 +376,13 @@ func RegisterWalletUnlockerHandlerClient(ctx context.Context, mux *runtime.Serve } var ( - pattern_WalletUnlocker_GenSeed_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "genseed"}, "")) + pattern_WalletUnlocker_GenSeed_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "genseed"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_WalletUnlocker_InitWallet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "initwallet"}, "")) + pattern_WalletUnlocker_InitWallet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "initwallet"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_WalletUnlocker_UnlockWallet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "unlockwallet"}, "")) + pattern_WalletUnlocker_UnlockWallet_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "unlockwallet"}, "", runtime.AssumeColonVerbOpt(true))) - pattern_WalletUnlocker_ChangePassword_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "changepassword"}, "")) + pattern_WalletUnlocker_ChangePassword_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "changepassword"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( diff --git a/lnrpc/walletunlocker.proto b/lnrpc/walletunlocker.proto index feaee39952..ec3ac2576d 100644 --- a/lnrpc/walletunlocker.proto +++ b/lnrpc/walletunlocker.proto @@ -1,6 +1,5 @@ syntax = "proto3"; -import "google/api/annotations.proto"; import "rpc.proto"; package lnrpc; @@ -38,11 +37,7 @@ service WalletUnlocker { method should be used to commit the newly generated seed, and create the wallet. */ - rpc GenSeed (GenSeedRequest) returns (GenSeedResponse) { - option (google.api.http) = { - get: "/v1/genseed" - }; - } + rpc GenSeed (GenSeedRequest) returns (GenSeedResponse); /* InitWallet is used when lnd is starting up for the first time to fully @@ -58,35 +53,19 @@ service WalletUnlocker { seed, then present it to the user. Once it has been verified by the user, the seed can be fed into this RPC in order to commit the new wallet. */ - rpc InitWallet (InitWalletRequest) returns (InitWalletResponse) { - option (google.api.http) = { - post: "/v1/initwallet" - body: "*" - }; - } + rpc InitWallet (InitWalletRequest) returns (InitWalletResponse); /* lncli: `unlock` UnlockWallet is used at startup of lnd to provide a password to unlock the wallet database. */ - rpc UnlockWallet (UnlockWalletRequest) returns (UnlockWalletResponse) { - option (google.api.http) = { - post: "/v1/unlockwallet" - body: "*" - }; - } + rpc UnlockWallet (UnlockWalletRequest) returns (UnlockWalletResponse); /* lncli: `changepassword` ChangePassword changes the password of the encrypted wallet. This will automatically unlock the wallet database if successful. */ - rpc ChangePassword (ChangePasswordRequest) - returns (ChangePasswordResponse) { - option (google.api.http) = { - post: "/v1/changepassword" - body: "*" - }; - } + rpc ChangePassword (ChangePasswordRequest) returns (ChangePasswordResponse); } message GenSeedRequest { diff --git a/lnrpc/walletunlocker.swagger.json b/lnrpc/walletunlocker.swagger.json index f2688f2567..513fbfc3a9 100644 --- a/lnrpc/walletunlocker.swagger.json +++ b/lnrpc/walletunlocker.swagger.json @@ -4,10 +4,6 @@ "title": "walletunlocker.proto", "version": "version not set" }, - "schemes": [ - "http", - "https" - ], "consumes": [ "application/json" ], @@ -25,6 +21,12 @@ "schema": { "$ref": "#/definitions/lnrpcChangePasswordResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -53,6 +55,12 @@ "schema": { "$ref": "#/definitions/lnrpcGenSeedResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -89,6 +97,12 @@ "schema": { "$ref": "#/definitions/lnrpcInitWalletResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -116,6 +130,12 @@ "schema": { "$ref": "#/definitions/lnrpcUnlockWalletResponse" } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } } }, "parameters": [ @@ -300,6 +320,39 @@ }, "lnrpcUnlockWalletResponse": { "type": "object" + }, + "protobufAny": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } } } } diff --git a/lnrpc/watchtowerrpc/handler.go b/lnrpc/watchtowerrpc/handler.go index fe44b92dae..d41247084b 100644 --- a/lnrpc/watchtowerrpc/handler.go +++ b/lnrpc/watchtowerrpc/handler.go @@ -7,6 +7,7 @@ import ( "errors" fmt "fmt" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/lightningnetwork/lnd/lnrpc" "google.golang.org/grpc" "gopkg.in/macaroon-bakery.v2/bakery" @@ -91,6 +92,28 @@ func (c *Handler) RegisterWithRootServer(grpcServer *grpc.Server) error { return nil } +// RegisterWithRestServer will be called by the root REST mux to direct a sub +// RPC server to register itself with the main REST mux server. Until this is +// called, each sub-server won't be able to have requests routed towards it. +// +// NOTE: This is part of the lnrpc.SubServer interface. +func (c *Handler) RegisterWithRestServer(ctx context.Context, + mux *runtime.ServeMux, dest string, opts []grpc.DialOption) error { + + // We make sure that we register it with the main REST server to ensure + // all our methods are routed properly. + err := RegisterWatchtowerHandlerFromEndpoint(ctx, mux, dest, opts) + if err != nil { + log.Errorf("Could not register Watchtower REST server "+ + "with root REST server: %v", err) + return err + } + + log.Debugf("Watchtower REST server successfully registered with " + + "root REST server") + return nil +} + // AddTower adds a new watchtower reachable at the given address and considers // it for new sessions. If the watchtower already exists, then any new addresses // included will be considered when dialing it for session negotiations and diff --git a/lnrpc/watchtowerrpc/watchtower.pb.go b/lnrpc/watchtowerrpc/watchtower.pb.go index 562d16b421..9c4bb93f68 100644 --- a/lnrpc/watchtowerrpc/watchtower.pb.go +++ b/lnrpc/watchtowerrpc/watchtower.pb.go @@ -8,6 +8,8 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" math "math" ) @@ -181,6 +183,14 @@ type WatchtowerServer interface { GetInfo(context.Context, *GetInfoRequest) (*GetInfoResponse, error) } +// UnimplementedWatchtowerServer can be embedded to have forward compatible implementations. +type UnimplementedWatchtowerServer struct { +} + +func (*UnimplementedWatchtowerServer) GetInfo(ctx context.Context, req *GetInfoRequest) (*GetInfoResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetInfo not implemented") +} + func RegisterWatchtowerServer(s *grpc.Server, srv WatchtowerServer) { s.RegisterService(&_Watchtower_serviceDesc, srv) } diff --git a/lnrpc/watchtowerrpc/watchtower.pb.gw.go b/lnrpc/watchtowerrpc/watchtower.pb.gw.go new file mode 100644 index 0000000000..5fecdb720a --- /dev/null +++ b/lnrpc/watchtowerrpc/watchtower.pb.gw.go @@ -0,0 +1,147 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: watchtowerrpc/watchtower.proto + +/* +Package watchtowerrpc is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package watchtowerrpc + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage + +func request_Watchtower_GetInfo_0(ctx context.Context, marshaler runtime.Marshaler, client WatchtowerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetInfoRequest + var metadata runtime.ServerMetadata + + msg, err := client.GetInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Watchtower_GetInfo_0(ctx context.Context, marshaler runtime.Marshaler, server WatchtowerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetInfoRequest + var metadata runtime.ServerMetadata + + msg, err := server.GetInfo(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterWatchtowerHandlerServer registers the http handlers for service Watchtower to "mux". +// UnaryRPC :call WatchtowerServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +func RegisterWatchtowerHandlerServer(ctx context.Context, mux *runtime.ServeMux, server WatchtowerServer) error { + + mux.Handle("GET", pattern_Watchtower_GetInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Watchtower_GetInfo_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Watchtower_GetInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterWatchtowerHandlerFromEndpoint is same as RegisterWatchtowerHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterWatchtowerHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterWatchtowerHandler(ctx, mux, conn) +} + +// RegisterWatchtowerHandler registers the http handlers for service Watchtower to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterWatchtowerHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterWatchtowerHandlerClient(ctx, mux, NewWatchtowerClient(conn)) +} + +// RegisterWatchtowerHandlerClient registers the http handlers for service Watchtower +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "WatchtowerClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "WatchtowerClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "WatchtowerClient" to call the correct interceptors. +func RegisterWatchtowerHandlerClient(ctx context.Context, mux *runtime.ServeMux, client WatchtowerClient) error { + + mux.Handle("GET", pattern_Watchtower_GetInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Watchtower_GetInfo_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Watchtower_GetInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Watchtower_GetInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "watchtower", "server"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_Watchtower_GetInfo_0 = runtime.ForwardResponseMessage +) diff --git a/lnrpc/watchtowerrpc/watchtower.swagger.json b/lnrpc/watchtowerrpc/watchtower.swagger.json index 5fea6d9d79..60d4023f80 100644 --- a/lnrpc/watchtowerrpc/watchtower.swagger.json +++ b/lnrpc/watchtowerrpc/watchtower.swagger.json @@ -4,18 +4,71 @@ "title": "watchtowerrpc/watchtower.proto", "version": "version not set" }, - "schemes": [ - "http", - "https" - ], "consumes": [ "application/json" ], "produces": [ "application/json" ], - "paths": {}, + "paths": { + "/v2/watchtower/server": { + "get": { + "summary": "lncli: tower info\nGetInfo returns general information concerning the companion watchtower\nincluding its public key and URIs where the server is currently\nlistening for clients.", + "operationId": "GetInfo", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/watchtowerrpcGetInfoResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "Watchtower" + ] + } + } + }, "definitions": { + "protobufAny": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } + }, "watchtowerrpcGetInfoResponse": { "type": "object", "properties": { diff --git a/lnrpc/wtclientrpc/wtclient.go b/lnrpc/wtclientrpc/wtclient.go index b6f1fa2a8f..acd136efa1 100644 --- a/lnrpc/wtclientrpc/wtclient.go +++ b/lnrpc/wtclientrpc/wtclient.go @@ -8,6 +8,7 @@ import ( "strconv" "github.com/btcsuite/btcd/btcec" + "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/lightningnetwork/lnd/lncfg" "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnwire" @@ -121,6 +122,24 @@ func (c *WatchtowerClient) RegisterWithRootServer(grpcServer *grpc.Server) error return nil } +// RegisterWithRestServer will be called by the root REST mux to direct a sub +// RPC server to register itself with the main REST mux server. Until this is +// called, each sub-server won't be able to have requests routed towards it. +// +// NOTE: This is part of the lnrpc.SubServer interface. +func (c *WatchtowerClient) RegisterWithRestServer(ctx context.Context, + mux *runtime.ServeMux, dest string, opts []grpc.DialOption) error { + + // We make sure that we register it with the main REST server to ensure + // all our methods are routed properly. + err := RegisterWatchtowerClientHandlerFromEndpoint(ctx, mux, dest, opts) + if err != nil { + return err + } + + return nil +} + // isActive returns nil if the watchtower client is initialized so that we can // process RPC requests. func (c *WatchtowerClient) isActive() error { diff --git a/lnrpc/wtclientrpc/wtclient.pb.go b/lnrpc/wtclientrpc/wtclient.pb.go index 3ccff8d3a8..abd6c450f3 100644 --- a/lnrpc/wtclientrpc/wtclient.pb.go +++ b/lnrpc/wtclientrpc/wtclient.pb.go @@ -8,6 +8,8 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" math "math" ) @@ -845,6 +847,29 @@ type WatchtowerClientServer interface { Policy(context.Context, *PolicyRequest) (*PolicyResponse, error) } +// UnimplementedWatchtowerClientServer can be embedded to have forward compatible implementations. +type UnimplementedWatchtowerClientServer struct { +} + +func (*UnimplementedWatchtowerClientServer) AddTower(ctx context.Context, req *AddTowerRequest) (*AddTowerResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddTower not implemented") +} +func (*UnimplementedWatchtowerClientServer) RemoveTower(ctx context.Context, req *RemoveTowerRequest) (*RemoveTowerResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveTower not implemented") +} +func (*UnimplementedWatchtowerClientServer) ListTowers(ctx context.Context, req *ListTowersRequest) (*ListTowersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListTowers not implemented") +} +func (*UnimplementedWatchtowerClientServer) GetTowerInfo(ctx context.Context, req *GetTowerInfoRequest) (*Tower, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTowerInfo not implemented") +} +func (*UnimplementedWatchtowerClientServer) Stats(ctx context.Context, req *StatsRequest) (*StatsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Stats not implemented") +} +func (*UnimplementedWatchtowerClientServer) Policy(ctx context.Context, req *PolicyRequest) (*PolicyResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Policy not implemented") +} + func RegisterWatchtowerClientServer(s *grpc.Server, srv WatchtowerClientServer) { s.RegisterService(&_WatchtowerClient_serviceDesc, srv) } diff --git a/lnrpc/wtclientrpc/wtclient.pb.gw.go b/lnrpc/wtclientrpc/wtclient.pb.gw.go new file mode 100644 index 0000000000..533bd9f777 --- /dev/null +++ b/lnrpc/wtclientrpc/wtclient.pb.gw.go @@ -0,0 +1,590 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: wtclientrpc/wtclient.proto + +/* +Package wtclientrpc is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package wtclientrpc + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage + +func request_WatchtowerClient_AddTower_0(ctx context.Context, marshaler runtime.Marshaler, client WatchtowerClientClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AddTowerRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.AddTower(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WatchtowerClient_AddTower_0(ctx context.Context, marshaler runtime.Marshaler, server WatchtowerClientServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq AddTowerRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.AddTower(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_WatchtowerClient_RemoveTower_0 = &utilities.DoubleArray{Encoding: map[string]int{"pubkey": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_WatchtowerClient_RemoveTower_0(ctx context.Context, marshaler runtime.Marshaler, client WatchtowerClientClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RemoveTowerRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pubkey"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pubkey") + } + + protoReq.Pubkey, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pubkey", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_WatchtowerClient_RemoveTower_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.RemoveTower(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WatchtowerClient_RemoveTower_0(ctx context.Context, marshaler runtime.Marshaler, server WatchtowerClientServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq RemoveTowerRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pubkey"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pubkey") + } + + protoReq.Pubkey, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pubkey", err) + } + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_WatchtowerClient_RemoveTower_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.RemoveTower(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_WatchtowerClient_ListTowers_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_WatchtowerClient_ListTowers_0(ctx context.Context, marshaler runtime.Marshaler, client WatchtowerClientClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListTowersRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_WatchtowerClient_ListTowers_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListTowers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WatchtowerClient_ListTowers_0(ctx context.Context, marshaler runtime.Marshaler, server WatchtowerClientServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListTowersRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_WatchtowerClient_ListTowers_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListTowers(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_WatchtowerClient_GetTowerInfo_0 = &utilities.DoubleArray{Encoding: map[string]int{"pubkey": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} +) + +func request_WatchtowerClient_GetTowerInfo_0(ctx context.Context, marshaler runtime.Marshaler, client WatchtowerClientClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetTowerInfoRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pubkey"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pubkey") + } + + protoReq.Pubkey, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pubkey", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_WatchtowerClient_GetTowerInfo_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.GetTowerInfo(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WatchtowerClient_GetTowerInfo_0(ctx context.Context, marshaler runtime.Marshaler, server WatchtowerClientServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetTowerInfoRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["pubkey"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "pubkey") + } + + protoReq.Pubkey, err = runtime.Bytes(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "pubkey", err) + } + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_WatchtowerClient_GetTowerInfo_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.GetTowerInfo(ctx, &protoReq) + return msg, metadata, err + +} + +func request_WatchtowerClient_Stats_0(ctx context.Context, marshaler runtime.Marshaler, client WatchtowerClientClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq StatsRequest + var metadata runtime.ServerMetadata + + msg, err := client.Stats(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WatchtowerClient_Stats_0(ctx context.Context, marshaler runtime.Marshaler, server WatchtowerClientServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq StatsRequest + var metadata runtime.ServerMetadata + + msg, err := server.Stats(ctx, &protoReq) + return msg, metadata, err + +} + +func request_WatchtowerClient_Policy_0(ctx context.Context, marshaler runtime.Marshaler, client WatchtowerClientClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PolicyRequest + var metadata runtime.ServerMetadata + + msg, err := client.Policy(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_WatchtowerClient_Policy_0(ctx context.Context, marshaler runtime.Marshaler, server WatchtowerClientServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq PolicyRequest + var metadata runtime.ServerMetadata + + msg, err := server.Policy(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterWatchtowerClientHandlerServer registers the http handlers for service WatchtowerClient to "mux". +// UnaryRPC :call WatchtowerClientServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +func RegisterWatchtowerClientHandlerServer(ctx context.Context, mux *runtime.ServeMux, server WatchtowerClientServer) error { + + mux.Handle("POST", pattern_WatchtowerClient_AddTower_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WatchtowerClient_AddTower_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WatchtowerClient_AddTower_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_WatchtowerClient_RemoveTower_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WatchtowerClient_RemoveTower_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WatchtowerClient_RemoveTower_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_WatchtowerClient_ListTowers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WatchtowerClient_ListTowers_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WatchtowerClient_ListTowers_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_WatchtowerClient_GetTowerInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WatchtowerClient_GetTowerInfo_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WatchtowerClient_GetTowerInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_WatchtowerClient_Stats_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WatchtowerClient_Stats_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WatchtowerClient_Stats_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_WatchtowerClient_Policy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_WatchtowerClient_Policy_0(rctx, inboundMarshaler, server, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WatchtowerClient_Policy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterWatchtowerClientHandlerFromEndpoint is same as RegisterWatchtowerClientHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterWatchtowerClientHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterWatchtowerClientHandler(ctx, mux, conn) +} + +// RegisterWatchtowerClientHandler registers the http handlers for service WatchtowerClient to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterWatchtowerClientHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterWatchtowerClientHandlerClient(ctx, mux, NewWatchtowerClientClient(conn)) +} + +// RegisterWatchtowerClientHandlerClient registers the http handlers for service WatchtowerClient +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "WatchtowerClientClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "WatchtowerClientClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "WatchtowerClientClient" to call the correct interceptors. +func RegisterWatchtowerClientHandlerClient(ctx context.Context, mux *runtime.ServeMux, client WatchtowerClientClient) error { + + mux.Handle("POST", pattern_WatchtowerClient_AddTower_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WatchtowerClient_AddTower_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WatchtowerClient_AddTower_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_WatchtowerClient_RemoveTower_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WatchtowerClient_RemoveTower_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WatchtowerClient_RemoveTower_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_WatchtowerClient_ListTowers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WatchtowerClient_ListTowers_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WatchtowerClient_ListTowers_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_WatchtowerClient_GetTowerInfo_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WatchtowerClient_GetTowerInfo_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WatchtowerClient_GetTowerInfo_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_WatchtowerClient_Stats_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WatchtowerClient_Stats_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WatchtowerClient_Stats_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_WatchtowerClient_Policy_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_WatchtowerClient_Policy_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_WatchtowerClient_Policy_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_WatchtowerClient_AddTower_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "watchtower", "client"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WatchtowerClient_RemoveTower_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "watchtower", "client", "pubkey"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WatchtowerClient_ListTowers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "watchtower", "client"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WatchtowerClient_GetTowerInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"v2", "watchtower", "client", "info", "pubkey"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WatchtowerClient_Stats_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "watchtower", "client", "stats"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_WatchtowerClient_Policy_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "watchtower", "client", "policy"}, "", runtime.AssumeColonVerbOpt(true))) +) + +var ( + forward_WatchtowerClient_AddTower_0 = runtime.ForwardResponseMessage + + forward_WatchtowerClient_RemoveTower_0 = runtime.ForwardResponseMessage + + forward_WatchtowerClient_ListTowers_0 = runtime.ForwardResponseMessage + + forward_WatchtowerClient_GetTowerInfo_0 = runtime.ForwardResponseMessage + + forward_WatchtowerClient_Stats_0 = runtime.ForwardResponseMessage + + forward_WatchtowerClient_Policy_0 = runtime.ForwardResponseMessage +) diff --git a/lnrpc/wtclientrpc/wtclient.swagger.json b/lnrpc/wtclientrpc/wtclient.swagger.json index 095510dbf3..5f7cc8c334 100644 --- a/lnrpc/wtclientrpc/wtclient.swagger.json +++ b/lnrpc/wtclientrpc/wtclient.swagger.json @@ -4,18 +4,253 @@ "title": "wtclientrpc/wtclient.proto", "version": "version not set" }, - "schemes": [ - "http", - "https" - ], "consumes": [ "application/json" ], "produces": [ "application/json" ], - "paths": {}, + "paths": { + "/v2/watchtower/client": { + "get": { + "summary": "ListTowers returns the list of watchtowers registered with the client.", + "operationId": "ListTowers", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/wtclientrpcListTowersResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "include_sessions", + "description": "Whether we should include sessions with the watchtower in the response.", + "in": "query", + "required": false, + "type": "boolean", + "format": "boolean" + } + ], + "tags": [ + "WatchtowerClient" + ] + }, + "post": { + "summary": "AddTower adds a new watchtower reachable at the given address and\nconsiders it for new sessions. If the watchtower already exists, then\nany new addresses included will be considered when dialing it for\nsession negotiations and backups.", + "operationId": "AddTower", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/wtclientrpcAddTowerResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/wtclientrpcAddTowerRequest" + } + } + ], + "tags": [ + "WatchtowerClient" + ] + } + }, + "/v2/watchtower/client/info/{pubkey}": { + "get": { + "summary": "GetTowerInfo retrieves information for a registered watchtower.", + "operationId": "GetTowerInfo", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/wtclientrpcTower" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "pubkey", + "description": "The identifying public key of the watchtower to retrieve information for.", + "in": "path", + "required": true, + "type": "string", + "format": "byte" + }, + { + "name": "include_sessions", + "description": "Whether we should include sessions with the watchtower in the response.", + "in": "query", + "required": false, + "type": "boolean", + "format": "boolean" + } + ], + "tags": [ + "WatchtowerClient" + ] + } + }, + "/v2/watchtower/client/policy": { + "get": { + "summary": "Policy returns the active watchtower client policy configuration.", + "operationId": "Policy", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/wtclientrpcPolicyResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "WatchtowerClient" + ] + } + }, + "/v2/watchtower/client/stats": { + "get": { + "summary": "Stats returns the in-memory statistics of the client since startup.", + "operationId": "Stats", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/wtclientrpcStatsResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "tags": [ + "WatchtowerClient" + ] + } + }, + "/v2/watchtower/client/{pubkey}": { + "delete": { + "summary": "RemoveTower removes a watchtower from being considered for future session\nnegotiations and from being used for any subsequent backups until it's added\nagain. If an address is provided, then this RPC only serves as a way of\nremoving the address from the watchtower instead.", + "operationId": "RemoveTower", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/wtclientrpcRemoveTowerResponse" + } + }, + "default": { + "description": "An unexpected error response", + "schema": { + "$ref": "#/definitions/runtimeError" + } + } + }, + "parameters": [ + { + "name": "pubkey", + "description": "The identifying public key of the watchtower to remove.", + "in": "path", + "required": true, + "type": "string", + "format": "byte" + }, + { + "name": "address", + "description": "If set, then the record for this address will be removed, indicating that is\nis stale. Otherwise, the watchtower will no longer be used for future\nsession negotiations and backups.", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "WatchtowerClient" + ] + } + } + }, "definitions": { + "protobufAny": { + "type": "object", + "properties": { + "type_url": { + "type": "string" + }, + "value": { + "type": "string", + "format": "byte" + } + } + }, + "runtimeError": { + "type": "object", + "properties": { + "error": { + "type": "string" + }, + "code": { + "type": "integer", + "format": "int32" + }, + "message": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/definitions/protobufAny" + } + } + } + }, + "wtclientrpcAddTowerRequest": { + "type": "object", + "properties": { + "pubkey": { + "type": "string", + "format": "byte", + "description": "The identifying public key of the watchtower to add." + }, + "address": { + "type": "string", + "description": "A network address the watchtower is reachable over." + } + } + }, "wtclientrpcAddTowerResponse": { "type": "object" }, diff --git a/rpcserver.go b/rpcserver.go index 81f6f0d0c4..f8e713ab77 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -791,23 +791,31 @@ func (r *rpcServer) Start() error { }, ) - // Finally, start the REST proxy for our gRPC server above. We'll ensure + // Now start the REST proxy for our gRPC server above. We'll ensure // we direct LND to connect to its loopback address rather than a // wildcard to prevent certificate issues when accessing the proxy // externally. - // - // TODO(roasbeef): eventually also allow the sub-servers to themselves - // have a REST proxy. restMux := proxy.NewServeMux(customMarshalerOption) restCtx, restCancel := context.WithCancel(context.Background()) r.listenerCleanUp = append(r.listenerCleanUp, restCancel) + // With our custom REST proxy mux created, register our main RPC and + // give all subservers a chance to register as well. err := lnrpc.RegisterLightningHandlerFromEndpoint( restCtx, restMux, r.restProxyDest, r.restDialOpts, ) if err != nil { return err } + for _, subServer := range r.subServers { + err := subServer.RegisterWithRestServer( + restCtx, restMux, r.restProxyDest, r.restDialOpts, + ) + if err != nil { + return fmt.Errorf("unable to register REST sub-server "+ + "%v with root: %v", subServer.Name(), err) + } + } // Before listening on any of the interfaces, we also want to give the // external subservers a chance to register their own REST proxy stub diff --git a/scripts/install_travis_proto.sh b/scripts/install_travis_proto.sh index 8208bd327c..38963f7bac 100755 --- a/scripts/install_travis_proto.sh +++ b/scripts/install_travis_proto.sh @@ -5,9 +5,9 @@ set -ev # See README.md in lnrpc why we need these specific versions/commits. PROTOC_VERSION=3.4.0 -PROTOBUF_VERSION="b5d812f8a3706043e23a9cd5babf2e5423744d30" -GENPROTO_VERSION="a8101f21cf983e773d0c1133ebc5424792003214" -GRPC_GATEWAY_VERSION="v1.8.6" +PROTOBUF_VERSION="v1.3.2" +GENPROTO_VERSION="20e1ac93f88cf06d2b1defb90b9e9e126c7dfff6" +GRPC_GATEWAY_VERSION="v1.14.3" # This script is specific to Travis CI so we only need to support linux x64. PROTOC_URL="https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VERSION}/protoc-${PROTOC_VERSION}-linux-x86_64.zip" @@ -36,6 +36,7 @@ install_protobuf() { git clone https://github.com/golang/protobuf "$install_path" fi pushd "$install_path" + git reset --hard master && git checkout master && git pull git reset --hard $PROTOBUF_VERSION make popd @@ -49,6 +50,7 @@ install_genproto() { git clone https://github.com/google/go-genproto "$install_path" fi pushd "$install_path" + git reset --hard master && git checkout master && git pull git reset --hard $GENPROTO_VERSION popd } @@ -61,6 +63,7 @@ install_grpc_gateway() { git clone https://github.com/grpc-ecosystem/grpc-gateway "$install_path" fi pushd "$install_path" + git reset --hard master && git checkout master && git pull git reset --hard $GRPC_GATEWAY_VERSION GO111MODULE=on go install ./protoc-gen-grpc-gateway ./protoc-gen-swagger popd