From ad9f59727557c3ff33926c18eed81654d57f5078 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 13 Jan 2025 15:24:14 +0100
Subject: [PATCH 01/42] feat(light): verify trusted light block hash
---
internal/statesync/reactor.go | 12 ++++++------
internal/statesync/reactor_test.go | 2 +-
internal/statesync/stateprovider.go | 6 ++++--
internal/statesync/syncer_test.go | 4 ++--
light/client.go | 13 ++++++++++---
light/client_test.go | 11 +++++++++++
light/light_test.go | 2 ++
7 files changed, 36 insertions(+), 14 deletions(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index e31088ff4e..d0219746d6 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -122,7 +122,7 @@ type Reactor struct {
initSyncer func() *syncer
requestSnaphot func() error
syncer *syncer // syncer is nil when sync is not in progress
- initStateProvider func(ctx context.Context, chainID string, initialHeight int64) error
+ initStateProvider func(ctx context.Context, chainID string, initialHeight int64, initialBlockHash []byte) error
stateProvider StateProvider
eventBus *eventbus.EventBus
@@ -234,7 +234,7 @@ func (r *Reactor) OnStart(ctx context.Context) error {
}
r.sendBlockError = blockCh.SendError
- r.initStateProvider = func(ctx context.Context, chainID string, initialHeight int64) error {
+ r.initStateProvider = func(ctx context.Context, chainID string, initialHeight int64, initialBlockHash []byte) error {
spLogger := r.logger.With("module", "stateprovider")
spLogger.Info("initializing state provider",
"trustHeight", r.cfg.TrustHeight, "useP2P", r.cfg.UseP2P)
@@ -250,8 +250,8 @@ func (r *Reactor) OnStart(ctx context.Context) error {
providers[idx] = NewBlockProvider(p, chainID, r.dispatcher)
}
- stateProvider, err := NewP2PStateProvider(ctx, chainID, initialHeight, r.cfg.TrustHeight, providers,
- paramsCh, r.logger.With("module", "stateprovider"), r.dashCoreClient)
+ stateProvider, err := NewP2PStateProvider(ctx, chainID, initialHeight, r.cfg.TrustHeight, r.cfg.TrustHashBytes(),
+ providers, paramsCh, r.logger.With("module", "stateprovider"), r.dashCoreClient)
if err != nil {
return fmt.Errorf("failed to initialize P2P state provider: %w", err)
}
@@ -259,7 +259,7 @@ func (r *Reactor) OnStart(ctx context.Context) error {
return nil
}
- stateProvider, err := NewRPCStateProvider(ctx, chainID, initialHeight, r.cfg.RPCServers, r.cfg.TrustHeight,
+ stateProvider, err := NewRPCStateProvider(ctx, chainID, initialHeight, r.cfg.RPCServers, r.cfg.TrustHeight, r.cfg.TrustHashBytes(),
spLogger, r.dashCoreClient)
if err != nil {
return fmt.Errorf("failed to initialize RPC state provider: %w", err)
@@ -386,7 +386,7 @@ func (r *Reactor) startStateProvider(ctx context.Context) error {
var err error
for retry := 0; retry < initStateProviderRetries; retry++ {
initCtx, cancel := context.WithTimeout(ctx, initStateProviderTimeout)
- err = r.initStateProvider(initCtx, r.chainID, r.initialHeight)
+ err = r.initStateProvider(initCtx, r.chainID, r.initialHeight, r.cfg.TrustHashBytes())
cancel()
if err == nil { // success
diff --git a/internal/statesync/reactor_test.go b/internal/statesync/reactor_test.go
index eff91961c4..c115dd5db9 100644
--- a/internal/statesync/reactor_test.go
+++ b/internal/statesync/reactor_test.go
@@ -625,7 +625,7 @@ func TestReactor_StateProviderP2P(t *testing.T) {
ictx, cancel := context.WithTimeout(ctx, time.Second)
defer cancel()
- err := rts.reactor.initStateProvider(ictx, factory.DefaultTestChainID, 1)
+ err := rts.reactor.initStateProvider(ictx, factory.DefaultTestChainID, 1, nil)
require.NoError(t, err)
rts.reactor.getSyncer().stateProvider = rts.reactor.stateProvider
diff --git a/internal/statesync/stateprovider.go b/internal/statesync/stateprovider.go
index b10324acc5..a76c6d546e 100644
--- a/internal/statesync/stateprovider.go
+++ b/internal/statesync/stateprovider.go
@@ -57,6 +57,7 @@ func NewRPCStateProvider(
initialHeight int64,
servers []string,
trustHeight int64,
+ trustBlockHash []byte,
logger log.Logger,
dashCoreClient dashcore.Client,
) (StateProvider, error) {
@@ -78,7 +79,7 @@ func NewRPCStateProvider(
providerRemotes[provider] = server
}
- lc, err := light.NewClientAtHeight(ctx, trustHeight, chainID, providers[0], providers[1:],
+ lc, err := light.NewClientAtHeight(ctx, trustHeight, trustBlockHash, chainID, providers[0], providers[1:],
lightdb.New(dbm.NewMemDB()), dashCoreClient, light.Logger(logger))
if err != nil {
return nil, err
@@ -209,6 +210,7 @@ func NewP2PStateProvider(
chainID string,
initialHeight int64,
trustHeight int64,
+ trustBlockHash []byte,
providers []lightprovider.Provider,
paramsSendCh p2p.Channel,
logger log.Logger,
@@ -218,7 +220,7 @@ func NewP2PStateProvider(
return nil, fmt.Errorf("at least 2 peers are required, got %d", len(providers))
}
- lc, err := light.NewClientAtHeight(ctx, trustHeight, chainID, providers[0], providers[1:],
+ lc, err := light.NewClientAtHeight(ctx, trustHeight, trustBlockHash, chainID, providers[0], providers[1:],
lightdb.New(dbm.NewMemDB()), dashCoreClient, light.Logger(logger))
if err != nil {
return nil, err
diff --git a/internal/statesync/syncer_test.go b/internal/statesync/syncer_test.go
index 00da83c9ed..0854c65122 100644
--- a/internal/statesync/syncer_test.go
+++ b/internal/statesync/syncer_test.go
@@ -616,8 +616,8 @@ func (suite *SyncerTestSuite) TestApplyChunksResults() {
fetchStartTime := time.Now()
- c := &chunk{Height: 1, Version: 1, ID: []byte{0}, Chunk: body}
- chunks.Enqueue(c.ID)
+ chunkID := []byte{0}
+ chunks.Enqueue(chunkID)
for _, resp := range tc.resps {
suite.conn.
diff --git a/light/client.go b/light/client.go
index e2e10487ec..3b7366bb8e 100644
--- a/light/client.go
+++ b/light/client.go
@@ -154,12 +154,13 @@ func NewClient(
dashCoreRPCClient dashcore.QuorumVerifier,
options ...Option) (*Client, error) {
- return NewClientAtHeight(ctx, 0, chainID, primary, witnesses, trustedStore, dashCoreRPCClient, options...)
+ return NewClientAtHeight(ctx, 0, nil, chainID, primary, witnesses, trustedStore, dashCoreRPCClient, options...)
}
func NewClientAtHeight(
ctx context.Context,
height int64,
+ trustedBlockHash []byte,
chainID string,
primary provider.Provider,
witnesses []provider.Provider,
@@ -179,7 +180,7 @@ func NewClientAtHeight(
if c.latestTrustedBlock == nil && height > 0 {
c.logger.Info("Downloading trusted light block")
- if err := c.initializeAtHeight(ctx, height); err != nil {
+ if err := c.initializeAtHeight(ctx, height, trustedBlockHash); err != nil {
return nil, fmt.Errorf("initialize at height: %w", err)
}
}
@@ -260,7 +261,8 @@ func (c *Client) initialize(ctx context.Context) error {
// initializeAtHeight fetches a light block at given height from
// primary provider.
-func (c *Client) initializeAtHeight(ctx context.Context, height int64) error {
+// If blockHash is not nil, it will be used to verify the block.
+func (c *Client) initializeAtHeight(ctx context.Context, height int64, blockHash []byte) error {
// 1) Fetch and verify the light block.
l, err := c.lightBlockFromPrimaryAtHeight(ctx, height)
if err != nil {
@@ -274,6 +276,11 @@ func (c *Client) initializeAtHeight(ctx context.Context, height int64) error {
return fmt.Errorf("validate light block: %w", err)
}
+ // 1.5) Verify that block hash matches the expected hash
+ if len(blockHash) > 0 && !bytes.Equal(l.Hash(), blockHash) {
+ return fmt.Errorf("block hash %x does not match expected hash %x", l.Hash(), blockHash)
+ }
+
// 2) Ensure the commit height is correct
if l.Height != l.Commit.Height {
return fmt.Errorf("invalid commit: height %d does not match commit height %d", l.Height, l.Commit.Height)
diff --git a/light/client_test.go b/light/client_test.go
index 8dbecbe852..c60d0b226c 100644
--- a/light/client_test.go
+++ b/light/client_test.go
@@ -138,6 +138,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockFullNode,
nil,
@@ -168,6 +169,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockFullNode,
nil,
@@ -209,6 +211,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockNode,
nil,
@@ -242,6 +245,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockNode,
nil,
@@ -285,6 +289,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockFullNode,
[]provider.Provider{mockWitnessNode},
@@ -316,6 +321,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockFullNode,
nil,
@@ -370,6 +376,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockDeadNode,
[]provider.Provider{mockFullNode},
@@ -412,6 +419,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockDeadNode1,
[]provider.Provider{mockFullNode, mockDeadNode2},
@@ -505,6 +513,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockFullNode,
[]provider.Provider{mockBadValSetNode, mockGoodWitness},
@@ -552,6 +561,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockFullNode,
[]provider.Provider{mockGoodWitness},
@@ -646,6 +656,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockBadNode,
nil,
diff --git a/light/light_test.go b/light/light_test.go
index 2403670bfd..82cbe6c18b 100644
--- a/light/light_test.go
+++ b/light/light_test.go
@@ -70,6 +70,7 @@ func TestClientIntegration_Update(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
primary,
nil,
@@ -215,6 +216,7 @@ func TestClientStatusRPC(t *testing.T) {
c, err := light.NewClientAtHeight(ctx,
2,
+ nil,
chainID,
primary,
witnesses,
From 566545f6e25934d9e427c95c940f1f9eb368d591 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 13 Jan 2025 16:49:12 +0100
Subject: [PATCH 02/42] fix(light): light block fails with invalid sig format
---
go.mod | 8 ++++----
go.sum | 15 ++++++++-------
2 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/go.mod b/go.mod
index dffe80c756..472ec381c0 100644
--- a/go.mod
+++ b/go.mod
@@ -9,8 +9,8 @@ require (
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce
github.com/containerd/continuity v0.4.4 // indirect
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8
- github.com/dashpay/dashd-go v0.25.0
- github.com/dashpay/dashd-go/btcec/v2 v2.1.0 // indirect
+ github.com/dashpay/dashd-go v0.26.1-0.20250113154619-015ef93ad36e
+ github.com/dashpay/dashd-go/btcec/v2 v2.2.0 // indirect
github.com/fortytw2/leaktest v1.3.0
github.com/fxamacker/cbor/v2 v2.4.0
github.com/go-chi/chi v4.1.2+incompatible // indirect
@@ -80,7 +80,7 @@ require (
github.com/alexkohler/nakedret/v2 v2.0.5 // indirect
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
github.com/bombsimon/wsl/v4 v4.4.1 // indirect
- github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect
+ github.com/btcsuite/btclog v1.0.0 // indirect
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect
github.com/bufbuild/protocompile v0.14.1 // indirect
@@ -108,7 +108,7 @@ require (
github.com/containerd/ttrpc v1.2.6 // indirect
github.com/containerd/typeurl/v2 v2.2.3 // indirect
github.com/curioswitch/go-reassign v0.2.0 // indirect
- github.com/dashpay/dashd-go/btcutil v1.2.0 // indirect
+ github.com/dashpay/dashd-go/btcutil v1.3.0 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect
github.com/dgraph-io/badger/v4 v4.3.1 // indirect
github.com/didip/tollbooth/v6 v6.0.1 // indirect
diff --git a/go.sum b/go.sum
index 9f7ab30f1b..d136be00f1 100644
--- a/go.sum
+++ b/go.sum
@@ -104,8 +104,9 @@ github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c=
github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y=
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ=
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
-github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo=
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
+github.com/btcsuite/btclog v1.0.0 h1:sEkpKJMmfGiyZjADwEIgB1NSwMyfdD1FB8v6+w1T0Ns=
+github.com/btcsuite/btclog v1.0.0/go.mod h1:w7xnGOhwT3lmrS4H3b/D1XAXxvh+tbhUm8xeHN2y3TQ=
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ=
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o=
@@ -217,12 +218,12 @@ github.com/daixiang0/gci v0.13.5 h1:kThgmH1yBmZSBCh1EJVxQ7JsHpm5Oms0AMed/0LaH4c=
github.com/daixiang0/gci v0.13.5/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk=
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8 h1:v4K3CiDoFY1gjcWL/scRcwzyjBwh8TVG3ek8cWolK1g=
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8/go.mod h1:auvGS60NBZ+a21aCCQh366PdsjDvHinsCvl28VrYPu4=
-github.com/dashpay/dashd-go v0.25.0 h1:tswVRmM2fLHC/JhpuAZ5Oa0TpOO6L+tqiE+QLTCvIQc=
-github.com/dashpay/dashd-go v0.25.0/go.mod h1:4yuk/laGME2RnQRTdqTbw87PhT+42hE1anLCnpkgls8=
-github.com/dashpay/dashd-go/btcec/v2 v2.1.0 h1:fXwlLf5H+TtgHxjGMU74NesKzk6NisjKMPF04pBcygk=
-github.com/dashpay/dashd-go/btcec/v2 v2.1.0/go.mod h1:1i8XtxdOmvK6mYEUCneVXTzFbrCUw3wq1u91j8gvsns=
-github.com/dashpay/dashd-go/btcutil v1.2.0 h1:YMq7L0V0au5bbphIhpsBBc+nfOZqU+gJ4pkgRZB7Eiw=
-github.com/dashpay/dashd-go/btcutil v1.2.0/go.mod h1:7UHoqUh3LY3OI4mEcogx0CnL3rtzDQyoqvsOCZZtvzE=
+github.com/dashpay/dashd-go v0.26.1-0.20250113154619-015ef93ad36e h1:VAyUrB9BWe05tSuEx5xW0LsxBtm4TPltetB0BwFHVEs=
+github.com/dashpay/dashd-go v0.26.1-0.20250113154619-015ef93ad36e/go.mod h1:7KKS2jSPkC1pTz9WLXpiXZ96wT5bUqKTRuk35AyRQ74=
+github.com/dashpay/dashd-go/btcec/v2 v2.2.0 h1:tk54BC++OvOUu0vcPoG8+45dGoJXKsmupYAawBO/1Vk=
+github.com/dashpay/dashd-go/btcec/v2 v2.2.0/go.mod h1:uOmCM/hVoJ1x6w+3SX+zQv+2LdrK3aO59RV41jNvTF4=
+github.com/dashpay/dashd-go/btcutil v1.3.0 h1:yDX8tz7C/KhFHbGlRXBpNN+zlkmAgwkICD9DlAv/Vsc=
+github.com/dashpay/dashd-go/btcutil v1.3.0/go.mod h1:sMWZ0iR8a/wmIA6b5+ccjOGUfq+iZvi5t6ECaLCW+kw=
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
From 6c3fa223035f5b669991b570782384b54876a113 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Tue, 14 Jan 2025 10:02:11 +0100
Subject: [PATCH 03/42] chore: fix mock core server for new quorum verify
---
test/e2e/pkg/mockcoreserver/core_server.go | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/test/e2e/pkg/mockcoreserver/core_server.go b/test/e2e/pkg/mockcoreserver/core_server.go
index 4b6025e125..fbe9d149ed 100644
--- a/test/e2e/pkg/mockcoreserver/core_server.go
+++ b/test/e2e/pkg/mockcoreserver/core_server.go
@@ -146,9 +146,8 @@ func (c *MockCoreServer) QuorumVerify(ctx context.Context, cmd btcjson.QuorumCmd
signatureVerified := thresholdPublicKey.VerifySignatureDigest(signID, signature)
- res := btcjson.QuorumVerifyResult{
- Result: signatureVerified,
- }
+ res := btcjson.QuorumVerifyResult(signatureVerified)
+
return res
}
From 2780a4abdc670b826b0d7d3b4dd3c51a2b25e621 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Tue, 14 Jan 2025 11:09:04 +0100
Subject: [PATCH 04/42] fix(statesync): allow empty chunks
---
internal/statesync/chunks.go | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/internal/statesync/chunks.go b/internal/statesync/chunks.go
index bd9d23e880..57edbf5eed 100644
--- a/internal/statesync/chunks.go
+++ b/internal/statesync/chunks.go
@@ -133,9 +133,16 @@ func (q *chunkQueue) dequeue() (bytes.HexBytes, error) {
// Add adds a chunk to the queue. It ignores chunks that already exist, returning false.
func (q *chunkQueue) Add(chunk *chunk) (bool, error) {
- if chunk == nil || chunk.Chunk == nil {
+ if chunk == nil {
return false, errChunkNil
}
+
+ // empty chunk content is allowed, but we ensure it's not nil
+ data := chunk.Chunk
+ if data == nil {
+ data = []byte{}
+ }
+
q.mtx.Lock()
defer q.mtx.Unlock()
if q.snapshot == nil {
@@ -154,7 +161,7 @@ func (q *chunkQueue) Add(chunk *chunk) (bool, error) {
return false, err
}
item.file = filepath.Join(q.dir, chunkIDKey)
- err = item.write(chunk.Chunk)
+ err = item.write(data)
if err != nil {
return false, err
}
From 77cde71284ba2bb51f1a493c3b606c0fe41636cd Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 15 Jan 2025 15:11:03 +0100
Subject: [PATCH 05/42] feat(proto):RequestFinalizeSnapshotSync
---
abci/types/types.pb.go | 1200 +++++++++++++++++++++--------
light/example_test.go | 91 +++
proto/tendermint/abci/types.proto | 78 +-
spec/abci++/api.md | 32 +
4 files changed, 1038 insertions(+), 363 deletions(-)
diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go
index f60329ec91..8f7432f1af 100644
--- a/abci/types/types.pb.go
+++ b/abci/types/types.pb.go
@@ -124,7 +124,7 @@ func (x ResponseOfferSnapshot_Result) String() string {
}
func (ResponseOfferSnapshot_Result) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{25, 0}
+ return fileDescriptor_252557cfdd89a31a, []int{26, 0}
}
type ResponseApplySnapshotChunk_Result int32
@@ -164,7 +164,7 @@ func (x ResponseApplySnapshotChunk_Result) String() string {
}
func (ResponseApplySnapshotChunk_Result) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{27, 0}
+ return fileDescriptor_252557cfdd89a31a, []int{28, 0}
}
type ResponseProcessProposal_ProposalStatus int32
@@ -192,7 +192,7 @@ func (x ResponseProcessProposal_ProposalStatus) String() string {
}
func (ResponseProcessProposal_ProposalStatus) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{29, 0}
+ return fileDescriptor_252557cfdd89a31a, []int{31, 0}
}
type ResponseVerifyVoteExtension_VerifyStatus int32
@@ -220,7 +220,7 @@ func (x ResponseVerifyVoteExtension_VerifyStatus) String() string {
}
func (ResponseVerifyVoteExtension_VerifyStatus) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{32, 0}
+ return fileDescriptor_252557cfdd89a31a, []int{34, 0}
}
// TxAction contains App-provided information on what to do with a transaction that is part of a raw proposal
@@ -255,7 +255,7 @@ func (x TxRecord_TxAction) String() string {
}
func (TxRecord_TxAction) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{39, 0}
+ return fileDescriptor_252557cfdd89a31a, []int{41, 0}
}
// Request types
@@ -271,6 +271,7 @@ type Request struct {
// *Request_OfferSnapshot
// *Request_LoadSnapshotChunk
// *Request_ApplySnapshotChunk
+ // *Request_FinalizeSnapshotSync
// *Request_PrepareProposal
// *Request_ProcessProposal
// *Request_ExtendVote
@@ -348,6 +349,9 @@ type Request_LoadSnapshotChunk struct {
type Request_ApplySnapshotChunk struct {
ApplySnapshotChunk *RequestApplySnapshotChunk `protobuf:"bytes,14,opt,name=apply_snapshot_chunk,json=applySnapshotChunk,proto3,oneof" json:"apply_snapshot_chunk,omitempty"`
}
+type Request_FinalizeSnapshotSync struct {
+ FinalizeSnapshotSync *RequestFinalizeSnapshotSync `protobuf:"bytes,20,opt,name=finalize_snapshot_sync,json=finalizeSnapshotSync,proto3,oneof" json:"finalize_snapshot_sync,omitempty"`
+}
type Request_PrepareProposal struct {
PrepareProposal *RequestPrepareProposal `protobuf:"bytes,15,opt,name=prepare_proposal,json=prepareProposal,proto3,oneof" json:"prepare_proposal,omitempty"`
}
@@ -364,21 +368,22 @@ type Request_FinalizeBlock struct {
FinalizeBlock *RequestFinalizeBlock `protobuf:"bytes,19,opt,name=finalize_block,json=finalizeBlock,proto3,oneof" json:"finalize_block,omitempty"`
}
-func (*Request_Echo) isRequest_Value() {}
-func (*Request_Flush) isRequest_Value() {}
-func (*Request_Info) isRequest_Value() {}
-func (*Request_InitChain) isRequest_Value() {}
-func (*Request_Query) isRequest_Value() {}
-func (*Request_CheckTx) isRequest_Value() {}
-func (*Request_ListSnapshots) isRequest_Value() {}
-func (*Request_OfferSnapshot) isRequest_Value() {}
-func (*Request_LoadSnapshotChunk) isRequest_Value() {}
-func (*Request_ApplySnapshotChunk) isRequest_Value() {}
-func (*Request_PrepareProposal) isRequest_Value() {}
-func (*Request_ProcessProposal) isRequest_Value() {}
-func (*Request_ExtendVote) isRequest_Value() {}
-func (*Request_VerifyVoteExtension) isRequest_Value() {}
-func (*Request_FinalizeBlock) isRequest_Value() {}
+func (*Request_Echo) isRequest_Value() {}
+func (*Request_Flush) isRequest_Value() {}
+func (*Request_Info) isRequest_Value() {}
+func (*Request_InitChain) isRequest_Value() {}
+func (*Request_Query) isRequest_Value() {}
+func (*Request_CheckTx) isRequest_Value() {}
+func (*Request_ListSnapshots) isRequest_Value() {}
+func (*Request_OfferSnapshot) isRequest_Value() {}
+func (*Request_LoadSnapshotChunk) isRequest_Value() {}
+func (*Request_ApplySnapshotChunk) isRequest_Value() {}
+func (*Request_FinalizeSnapshotSync) isRequest_Value() {}
+func (*Request_PrepareProposal) isRequest_Value() {}
+func (*Request_ProcessProposal) isRequest_Value() {}
+func (*Request_ExtendVote) isRequest_Value() {}
+func (*Request_VerifyVoteExtension) isRequest_Value() {}
+func (*Request_FinalizeBlock) isRequest_Value() {}
func (m *Request) GetValue() isRequest_Value {
if m != nil {
@@ -457,6 +462,13 @@ func (m *Request) GetApplySnapshotChunk() *RequestApplySnapshotChunk {
return nil
}
+func (m *Request) GetFinalizeSnapshotSync() *RequestFinalizeSnapshotSync {
+ if x, ok := m.GetValue().(*Request_FinalizeSnapshotSync); ok {
+ return x.FinalizeSnapshotSync
+ }
+ return nil
+}
+
func (m *Request) GetPrepareProposal() *RequestPrepareProposal {
if x, ok := m.GetValue().(*Request_PrepareProposal); ok {
return x.PrepareProposal
@@ -505,6 +517,7 @@ func (*Request) XXX_OneofWrappers() []interface{} {
(*Request_OfferSnapshot)(nil),
(*Request_LoadSnapshotChunk)(nil),
(*Request_ApplySnapshotChunk)(nil),
+ (*Request_FinalizeSnapshotSync)(nil),
(*Request_PrepareProposal)(nil),
(*Request_ProcessProposal)(nil),
(*Request_ExtendVote)(nil),
@@ -1161,6 +1174,63 @@ func (m *RequestApplySnapshotChunk) GetSender() string {
return ""
}
+// After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
+// It includes the light block committed at the synced height, which Tenderdash uses
+// to reconstruct its own state.
+type RequestFinalizeSnapshotSync struct {
+ // light block committed at the synced height
+ LightBlock *types1.LightBlock `protobuf:"bytes,1,opt,name=light_block,json=lightBlock,proto3" json:"light_block,omitempty"`
+ // commit fot the `light_block`
+ Commit *types1.Commit `protobuf:"bytes,2,opt,name=commit,proto3" json:"commit,omitempty"`
+}
+
+func (m *RequestFinalizeSnapshotSync) Reset() { *m = RequestFinalizeSnapshotSync{} }
+func (m *RequestFinalizeSnapshotSync) String() string { return proto.CompactTextString(m) }
+func (*RequestFinalizeSnapshotSync) ProtoMessage() {}
+func (*RequestFinalizeSnapshotSync) Descriptor() ([]byte, []int) {
+ return fileDescriptor_252557cfdd89a31a, []int{11}
+}
+func (m *RequestFinalizeSnapshotSync) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *RequestFinalizeSnapshotSync) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_RequestFinalizeSnapshotSync.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *RequestFinalizeSnapshotSync) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_RequestFinalizeSnapshotSync.Merge(m, src)
+}
+func (m *RequestFinalizeSnapshotSync) XXX_Size() int {
+ return m.Size()
+}
+func (m *RequestFinalizeSnapshotSync) XXX_DiscardUnknown() {
+ xxx_messageInfo_RequestFinalizeSnapshotSync.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RequestFinalizeSnapshotSync proto.InternalMessageInfo
+
+func (m *RequestFinalizeSnapshotSync) GetLightBlock() *types1.LightBlock {
+ if m != nil {
+ return m.LightBlock
+ }
+ return nil
+}
+
+func (m *RequestFinalizeSnapshotSync) GetCommit() *types1.Commit {
+ if m != nil {
+ return m.Commit
+ }
+ return nil
+}
+
// Prepare new block proposal, potentially altering list of transactions.
//
// #### Usage
@@ -1280,7 +1350,7 @@ func (m *RequestPrepareProposal) Reset() { *m = RequestPrepareProposal{}
func (m *RequestPrepareProposal) String() string { return proto.CompactTextString(m) }
func (*RequestPrepareProposal) ProtoMessage() {}
func (*RequestPrepareProposal) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{11}
+ return fileDescriptor_252557cfdd89a31a, []int{12}
}
func (m *RequestPrepareProposal) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1480,7 +1550,7 @@ func (m *RequestProcessProposal) Reset() { *m = RequestProcessProposal{}
func (m *RequestProcessProposal) String() string { return proto.CompactTextString(m) }
func (*RequestProcessProposal) ProtoMessage() {}
func (*RequestProcessProposal) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{12}
+ return fileDescriptor_252557cfdd89a31a, []int{13}
}
func (m *RequestProcessProposal) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1652,7 +1722,7 @@ func (m *RequestExtendVote) Reset() { *m = RequestExtendVote{} }
func (m *RequestExtendVote) String() string { return proto.CompactTextString(m) }
func (*RequestExtendVote) ProtoMessage() {}
func (*RequestExtendVote) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{13}
+ return fileDescriptor_252557cfdd89a31a, []int{14}
}
func (m *RequestExtendVote) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1747,7 +1817,7 @@ func (m *RequestVerifyVoteExtension) Reset() { *m = RequestVerifyVoteExt
func (m *RequestVerifyVoteExtension) String() string { return proto.CompactTextString(m) }
func (*RequestVerifyVoteExtension) ProtoMessage() {}
func (*RequestVerifyVoteExtension) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{14}
+ return fileDescriptor_252557cfdd89a31a, []int{15}
}
func (m *RequestVerifyVoteExtension) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1858,7 +1928,7 @@ func (m *RequestFinalizeBlock) Reset() { *m = RequestFinalizeBlock{} }
func (m *RequestFinalizeBlock) String() string { return proto.CompactTextString(m) }
func (*RequestFinalizeBlock) ProtoMessage() {}
func (*RequestFinalizeBlock) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{15}
+ return fileDescriptor_252557cfdd89a31a, []int{16}
}
func (m *RequestFinalizeBlock) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1950,6 +2020,7 @@ type Response struct {
// *Response_OfferSnapshot
// *Response_LoadSnapshotChunk
// *Response_ApplySnapshotChunk
+ // *Response_FinalizeSnapshotSync
// *Response_PrepareProposal
// *Response_ProcessProposal
// *Response_ExtendVote
@@ -1962,7 +2033,7 @@ func (m *Response) Reset() { *m = Response{} }
func (m *Response) String() string { return proto.CompactTextString(m) }
func (*Response) ProtoMessage() {}
func (*Response) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{16}
+ return fileDescriptor_252557cfdd89a31a, []int{17}
}
func (m *Response) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2030,6 +2101,9 @@ type Response_LoadSnapshotChunk struct {
type Response_ApplySnapshotChunk struct {
ApplySnapshotChunk *ResponseApplySnapshotChunk `protobuf:"bytes,11,opt,name=apply_snapshot_chunk,json=applySnapshotChunk,proto3,oneof" json:"apply_snapshot_chunk,omitempty"`
}
+type Response_FinalizeSnapshotSync struct {
+ FinalizeSnapshotSync *ResponseFinalizeSnapshotSync `protobuf:"bytes,17,opt,name=finalize_snapshot_sync,json=finalizeSnapshotSync,proto3,oneof" json:"finalize_snapshot_sync,omitempty"`
+}
type Response_PrepareProposal struct {
PrepareProposal *ResponsePrepareProposal `protobuf:"bytes,12,opt,name=prepare_proposal,json=prepareProposal,proto3,oneof" json:"prepare_proposal,omitempty"`
}
@@ -2046,22 +2120,23 @@ type Response_FinalizeBlock struct {
FinalizeBlock *ResponseFinalizeBlock `protobuf:"bytes,16,opt,name=finalize_block,json=finalizeBlock,proto3,oneof" json:"finalize_block,omitempty"`
}
-func (*Response_Exception) isResponse_Value() {}
-func (*Response_Echo) isResponse_Value() {}
-func (*Response_Flush) isResponse_Value() {}
-func (*Response_Info) isResponse_Value() {}
-func (*Response_InitChain) isResponse_Value() {}
-func (*Response_Query) isResponse_Value() {}
-func (*Response_CheckTx) isResponse_Value() {}
-func (*Response_ListSnapshots) isResponse_Value() {}
-func (*Response_OfferSnapshot) isResponse_Value() {}
-func (*Response_LoadSnapshotChunk) isResponse_Value() {}
-func (*Response_ApplySnapshotChunk) isResponse_Value() {}
-func (*Response_PrepareProposal) isResponse_Value() {}
-func (*Response_ProcessProposal) isResponse_Value() {}
-func (*Response_ExtendVote) isResponse_Value() {}
-func (*Response_VerifyVoteExtension) isResponse_Value() {}
-func (*Response_FinalizeBlock) isResponse_Value() {}
+func (*Response_Exception) isResponse_Value() {}
+func (*Response_Echo) isResponse_Value() {}
+func (*Response_Flush) isResponse_Value() {}
+func (*Response_Info) isResponse_Value() {}
+func (*Response_InitChain) isResponse_Value() {}
+func (*Response_Query) isResponse_Value() {}
+func (*Response_CheckTx) isResponse_Value() {}
+func (*Response_ListSnapshots) isResponse_Value() {}
+func (*Response_OfferSnapshot) isResponse_Value() {}
+func (*Response_LoadSnapshotChunk) isResponse_Value() {}
+func (*Response_ApplySnapshotChunk) isResponse_Value() {}
+func (*Response_FinalizeSnapshotSync) isResponse_Value() {}
+func (*Response_PrepareProposal) isResponse_Value() {}
+func (*Response_ProcessProposal) isResponse_Value() {}
+func (*Response_ExtendVote) isResponse_Value() {}
+func (*Response_VerifyVoteExtension) isResponse_Value() {}
+func (*Response_FinalizeBlock) isResponse_Value() {}
func (m *Response) GetValue() isResponse_Value {
if m != nil {
@@ -2147,6 +2222,13 @@ func (m *Response) GetApplySnapshotChunk() *ResponseApplySnapshotChunk {
return nil
}
+func (m *Response) GetFinalizeSnapshotSync() *ResponseFinalizeSnapshotSync {
+ if x, ok := m.GetValue().(*Response_FinalizeSnapshotSync); ok {
+ return x.FinalizeSnapshotSync
+ }
+ return nil
+}
+
func (m *Response) GetPrepareProposal() *ResponsePrepareProposal {
if x, ok := m.GetValue().(*Response_PrepareProposal); ok {
return x.PrepareProposal
@@ -2196,6 +2278,7 @@ func (*Response) XXX_OneofWrappers() []interface{} {
(*Response_OfferSnapshot)(nil),
(*Response_LoadSnapshotChunk)(nil),
(*Response_ApplySnapshotChunk)(nil),
+ (*Response_FinalizeSnapshotSync)(nil),
(*Response_PrepareProposal)(nil),
(*Response_ProcessProposal)(nil),
(*Response_ExtendVote)(nil),
@@ -2213,7 +2296,7 @@ func (m *ResponseException) Reset() { *m = ResponseException{} }
func (m *ResponseException) String() string { return proto.CompactTextString(m) }
func (*ResponseException) ProtoMessage() {}
func (*ResponseException) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{17}
+ return fileDescriptor_252557cfdd89a31a, []int{18}
}
func (m *ResponseException) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2257,7 +2340,7 @@ func (m *ResponseEcho) Reset() { *m = ResponseEcho{} }
func (m *ResponseEcho) String() string { return proto.CompactTextString(m) }
func (*ResponseEcho) ProtoMessage() {}
func (*ResponseEcho) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{18}
+ return fileDescriptor_252557cfdd89a31a, []int{19}
}
func (m *ResponseEcho) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2300,7 +2383,7 @@ func (m *ResponseFlush) Reset() { *m = ResponseFlush{} }
func (m *ResponseFlush) String() string { return proto.CompactTextString(m) }
func (*ResponseFlush) ProtoMessage() {}
func (*ResponseFlush) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{19}
+ return fileDescriptor_252557cfdd89a31a, []int{20}
}
func (m *ResponseFlush) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2341,7 +2424,7 @@ func (m *ResponseInfo) Reset() { *m = ResponseInfo{} }
func (m *ResponseInfo) String() string { return proto.CompactTextString(m) }
func (*ResponseInfo) ProtoMessage() {}
func (*ResponseInfo) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{20}
+ return fileDescriptor_252557cfdd89a31a, []int{21}
}
func (m *ResponseInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2426,7 +2509,7 @@ func (m *ResponseInitChain) Reset() { *m = ResponseInitChain{} }
func (m *ResponseInitChain) String() string { return proto.CompactTextString(m) }
func (*ResponseInitChain) ProtoMessage() {}
func (*ResponseInitChain) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{21}
+ return fileDescriptor_252557cfdd89a31a, []int{22}
}
func (m *ResponseInitChain) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2543,7 +2626,7 @@ func (m *ResponseQuery) Reset() { *m = ResponseQuery{} }
func (m *ResponseQuery) String() string { return proto.CompactTextString(m) }
func (*ResponseQuery) ProtoMessage() {}
func (*ResponseQuery) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{22}
+ return fileDescriptor_252557cfdd89a31a, []int{23}
}
func (m *ResponseQuery) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2649,7 +2732,7 @@ func (m *ResponseCheckTx) Reset() { *m = ResponseCheckTx{} }
func (m *ResponseCheckTx) String() string { return proto.CompactTextString(m) }
func (*ResponseCheckTx) ProtoMessage() {}
func (*ResponseCheckTx) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{23}
+ return fileDescriptor_252557cfdd89a31a, []int{24}
}
func (m *ResponseCheckTx) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2735,7 +2818,7 @@ func (m *ResponseListSnapshots) Reset() { *m = ResponseListSnapshots{} }
func (m *ResponseListSnapshots) String() string { return proto.CompactTextString(m) }
func (*ResponseListSnapshots) ProtoMessage() {}
func (*ResponseListSnapshots) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{24}
+ return fileDescriptor_252557cfdd89a31a, []int{25}
}
func (m *ResponseListSnapshots) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2779,7 +2862,7 @@ func (m *ResponseOfferSnapshot) Reset() { *m = ResponseOfferSnapshot{} }
func (m *ResponseOfferSnapshot) String() string { return proto.CompactTextString(m) }
func (*ResponseOfferSnapshot) ProtoMessage() {}
func (*ResponseOfferSnapshot) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{25}
+ return fileDescriptor_252557cfdd89a31a, []int{26}
}
func (m *ResponseOfferSnapshot) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2825,7 +2908,7 @@ func (m *ResponseLoadSnapshotChunk) Reset() { *m = ResponseLoadSnapshotC
func (m *ResponseLoadSnapshotChunk) String() string { return proto.CompactTextString(m) }
func (*ResponseLoadSnapshotChunk) ProtoMessage() {}
func (*ResponseLoadSnapshotChunk) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{26}
+ return fileDescriptor_252557cfdd89a31a, []int{27}
}
func (m *ResponseLoadSnapshotChunk) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2878,7 +2961,7 @@ func (m *ResponseApplySnapshotChunk) Reset() { *m = ResponseApplySnapsho
func (m *ResponseApplySnapshotChunk) String() string { return proto.CompactTextString(m) }
func (*ResponseApplySnapshotChunk) ProtoMessage() {}
func (*ResponseApplySnapshotChunk) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{27}
+ return fileDescriptor_252557cfdd89a31a, []int{28}
}
func (m *ResponseApplySnapshotChunk) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2935,6 +3018,43 @@ func (m *ResponseApplySnapshotChunk) GetNextChunks() [][]byte {
return nil
}
+// The response to a `RequestPrepareSnapshot` message.
+type ResponseFinalizeSnapshotSync struct {
+}
+
+func (m *ResponseFinalizeSnapshotSync) Reset() { *m = ResponseFinalizeSnapshotSync{} }
+func (m *ResponseFinalizeSnapshotSync) String() string { return proto.CompactTextString(m) }
+func (*ResponseFinalizeSnapshotSync) ProtoMessage() {}
+func (*ResponseFinalizeSnapshotSync) Descriptor() ([]byte, []int) {
+ return fileDescriptor_252557cfdd89a31a, []int{29}
+}
+func (m *ResponseFinalizeSnapshotSync) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *ResponseFinalizeSnapshotSync) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_ResponseFinalizeSnapshotSync.Marshal(b, m, deterministic)
+ } else {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+ }
+}
+func (m *ResponseFinalizeSnapshotSync) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_ResponseFinalizeSnapshotSync.Merge(m, src)
+}
+func (m *ResponseFinalizeSnapshotSync) XXX_Size() int {
+ return m.Size()
+}
+func (m *ResponseFinalizeSnapshotSync) XXX_DiscardUnknown() {
+ xxx_messageInfo_ResponseFinalizeSnapshotSync.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ResponseFinalizeSnapshotSync proto.InternalMessageInfo
+
type ResponsePrepareProposal struct {
// Possibly modified list of transactions that have been picked as part of the proposed block.
TxRecords []*TxRecord `protobuf:"bytes,1,rep,name=tx_records,json=txRecords,proto3" json:"tx_records,omitempty"`
@@ -2956,7 +3076,7 @@ func (m *ResponsePrepareProposal) Reset() { *m = ResponsePrepareProposal
func (m *ResponsePrepareProposal) String() string { return proto.CompactTextString(m) }
func (*ResponsePrepareProposal) ProtoMessage() {}
func (*ResponsePrepareProposal) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{28}
+ return fileDescriptor_252557cfdd89a31a, []int{30}
}
func (m *ResponsePrepareProposal) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3053,7 +3173,7 @@ func (m *ResponseProcessProposal) Reset() { *m = ResponseProcessProposal
func (m *ResponseProcessProposal) String() string { return proto.CompactTextString(m) }
func (*ResponseProcessProposal) ProtoMessage() {}
func (*ResponseProcessProposal) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{29}
+ return fileDescriptor_252557cfdd89a31a, []int{31}
}
func (m *ResponseProcessProposal) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3143,7 +3263,7 @@ func (m *ExtendVoteExtension) Reset() { *m = ExtendVoteExtension{} }
func (m *ExtendVoteExtension) String() string { return proto.CompactTextString(m) }
func (*ExtendVoteExtension) ProtoMessage() {}
func (*ExtendVoteExtension) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{30}
+ return fileDescriptor_252557cfdd89a31a, []int{32}
}
func (m *ExtendVoteExtension) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3227,7 +3347,7 @@ func (m *ResponseExtendVote) Reset() { *m = ResponseExtendVote{} }
func (m *ResponseExtendVote) String() string { return proto.CompactTextString(m) }
func (*ResponseExtendVote) ProtoMessage() {}
func (*ResponseExtendVote) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{31}
+ return fileDescriptor_252557cfdd89a31a, []int{33}
}
func (m *ResponseExtendVote) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3271,7 +3391,7 @@ func (m *ResponseVerifyVoteExtension) Reset() { *m = ResponseVerifyVoteE
func (m *ResponseVerifyVoteExtension) String() string { return proto.CompactTextString(m) }
func (*ResponseVerifyVoteExtension) ProtoMessage() {}
func (*ResponseVerifyVoteExtension) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{32}
+ return fileDescriptor_252557cfdd89a31a, []int{34}
}
func (m *ResponseVerifyVoteExtension) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3316,7 +3436,7 @@ func (m *ResponseFinalizeBlock) Reset() { *m = ResponseFinalizeBlock{} }
func (m *ResponseFinalizeBlock) String() string { return proto.CompactTextString(m) }
func (*ResponseFinalizeBlock) ProtoMessage() {}
func (*ResponseFinalizeBlock) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{33}
+ return fileDescriptor_252557cfdd89a31a, []int{35}
}
func (m *ResponseFinalizeBlock) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3363,7 +3483,7 @@ func (m *CommitInfo) Reset() { *m = CommitInfo{} }
func (m *CommitInfo) String() string { return proto.CompactTextString(m) }
func (*CommitInfo) ProtoMessage() {}
func (*CommitInfo) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{34}
+ return fileDescriptor_252557cfdd89a31a, []int{36}
}
func (m *CommitInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3434,7 +3554,7 @@ func (m *Event) Reset() { *m = Event{} }
func (m *Event) String() string { return proto.CompactTextString(m) }
func (*Event) ProtoMessage() {}
func (*Event) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{35}
+ return fileDescriptor_252557cfdd89a31a, []int{37}
}
func (m *Event) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3488,7 +3608,7 @@ func (m *EventAttribute) Reset() { *m = EventAttribute{} }
func (m *EventAttribute) String() string { return proto.CompactTextString(m) }
func (*EventAttribute) ProtoMessage() {}
func (*EventAttribute) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{36}
+ return fileDescriptor_252557cfdd89a31a, []int{38}
}
func (m *EventAttribute) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3554,7 +3674,7 @@ func (m *ExecTxResult) Reset() { *m = ExecTxResult{} }
func (m *ExecTxResult) String() string { return proto.CompactTextString(m) }
func (*ExecTxResult) ProtoMessage() {}
func (*ExecTxResult) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{37}
+ return fileDescriptor_252557cfdd89a31a, []int{39}
}
func (m *ExecTxResult) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3646,7 +3766,7 @@ func (m *TxResult) Reset() { *m = TxResult{} }
func (m *TxResult) String() string { return proto.CompactTextString(m) }
func (*TxResult) ProtoMessage() {}
func (*TxResult) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{38}
+ return fileDescriptor_252557cfdd89a31a, []int{40}
}
func (m *TxResult) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3712,7 +3832,7 @@ func (m *TxRecord) Reset() { *m = TxRecord{} }
func (m *TxRecord) String() string { return proto.CompactTextString(m) }
func (*TxRecord) ProtoMessage() {}
func (*TxRecord) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{39}
+ return fileDescriptor_252557cfdd89a31a, []int{41}
}
func (m *TxRecord) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3765,7 +3885,7 @@ func (m *Validator) Reset() { *m = Validator{} }
func (m *Validator) String() string { return proto.CompactTextString(m) }
func (*Validator) ProtoMessage() {}
func (*Validator) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{40}
+ return fileDescriptor_252557cfdd89a31a, []int{42}
}
func (m *Validator) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3823,7 +3943,7 @@ func (m *ValidatorUpdate) Reset() { *m = ValidatorUpdate{} }
func (m *ValidatorUpdate) String() string { return proto.CompactTextString(m) }
func (*ValidatorUpdate) ProtoMessage() {}
func (*ValidatorUpdate) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{41}
+ return fileDescriptor_252557cfdd89a31a, []int{43}
}
func (m *ValidatorUpdate) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3905,7 +4025,7 @@ func (m *ValidatorSetUpdate) Reset() { *m = ValidatorSetUpdate{} }
func (m *ValidatorSetUpdate) String() string { return proto.CompactTextString(m) }
func (*ValidatorSetUpdate) ProtoMessage() {}
func (*ValidatorSetUpdate) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{42}
+ return fileDescriptor_252557cfdd89a31a, []int{44}
}
func (m *ValidatorSetUpdate) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3963,7 +4083,7 @@ func (m *ThresholdPublicKeyUpdate) Reset() { *m = ThresholdPublicKeyUpda
func (m *ThresholdPublicKeyUpdate) String() string { return proto.CompactTextString(m) }
func (*ThresholdPublicKeyUpdate) ProtoMessage() {}
func (*ThresholdPublicKeyUpdate) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{43}
+ return fileDescriptor_252557cfdd89a31a, []int{45}
}
func (m *ThresholdPublicKeyUpdate) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4007,7 +4127,7 @@ func (m *QuorumHashUpdate) Reset() { *m = QuorumHashUpdate{} }
func (m *QuorumHashUpdate) String() string { return proto.CompactTextString(m) }
func (*QuorumHashUpdate) ProtoMessage() {}
func (*QuorumHashUpdate) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{44}
+ return fileDescriptor_252557cfdd89a31a, []int{46}
}
func (m *QuorumHashUpdate) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4053,7 +4173,7 @@ func (m *VoteInfo) Reset() { *m = VoteInfo{} }
func (m *VoteInfo) String() string { return proto.CompactTextString(m) }
func (*VoteInfo) ProtoMessage() {}
func (*VoteInfo) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{45}
+ return fileDescriptor_252557cfdd89a31a, []int{47}
}
func (m *VoteInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4110,7 +4230,7 @@ func (m *ExtendedVoteInfo) Reset() { *m = ExtendedVoteInfo{} }
func (m *ExtendedVoteInfo) String() string { return proto.CompactTextString(m) }
func (*ExtendedVoteInfo) ProtoMessage() {}
func (*ExtendedVoteInfo) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{46}
+ return fileDescriptor_252557cfdd89a31a, []int{48}
}
func (m *ExtendedVoteInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4178,7 +4298,7 @@ func (m *Misbehavior) Reset() { *m = Misbehavior{} }
func (m *Misbehavior) String() string { return proto.CompactTextString(m) }
func (*Misbehavior) ProtoMessage() {}
func (*Misbehavior) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{47}
+ return fileDescriptor_252557cfdd89a31a, []int{49}
}
func (m *Misbehavior) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4253,7 +4373,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} }
func (m *Snapshot) String() string { return proto.CompactTextString(m) }
func (*Snapshot) ProtoMessage() {}
func (*Snapshot) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{48}
+ return fileDescriptor_252557cfdd89a31a, []int{50}
}
func (m *Snapshot) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4329,6 +4449,7 @@ func init() {
proto.RegisterType((*RequestOfferSnapshot)(nil), "tendermint.abci.RequestOfferSnapshot")
proto.RegisterType((*RequestLoadSnapshotChunk)(nil), "tendermint.abci.RequestLoadSnapshotChunk")
proto.RegisterType((*RequestApplySnapshotChunk)(nil), "tendermint.abci.RequestApplySnapshotChunk")
+ proto.RegisterType((*RequestFinalizeSnapshotSync)(nil), "tendermint.abci.RequestFinalizeSnapshotSync")
proto.RegisterType((*RequestPrepareProposal)(nil), "tendermint.abci.RequestPrepareProposal")
proto.RegisterType((*RequestProcessProposal)(nil), "tendermint.abci.RequestProcessProposal")
proto.RegisterType((*RequestExtendVote)(nil), "tendermint.abci.RequestExtendVote")
@@ -4346,6 +4467,7 @@ func init() {
proto.RegisterType((*ResponseOfferSnapshot)(nil), "tendermint.abci.ResponseOfferSnapshot")
proto.RegisterType((*ResponseLoadSnapshotChunk)(nil), "tendermint.abci.ResponseLoadSnapshotChunk")
proto.RegisterType((*ResponseApplySnapshotChunk)(nil), "tendermint.abci.ResponseApplySnapshotChunk")
+ proto.RegisterType((*ResponseFinalizeSnapshotSync)(nil), "tendermint.abci.ResponseFinalizeSnapshotSync")
proto.RegisterType((*ResponsePrepareProposal)(nil), "tendermint.abci.ResponsePrepareProposal")
proto.RegisterType((*ResponseProcessProposal)(nil), "tendermint.abci.ResponseProcessProposal")
proto.RegisterType((*ExtendVoteExtension)(nil), "tendermint.abci.ExtendVoteExtension")
@@ -4372,239 +4494,245 @@ func init() {
func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) }
var fileDescriptor_252557cfdd89a31a = []byte{
- // 3712 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0xcb, 0x73, 0x1b, 0x47,
- 0x73, 0xc7, 0xe2, 0x8d, 0xc6, 0x6b, 0x39, 0xa4, 0x24, 0x08, 0x92, 0x48, 0x7a, 0x15, 0x5b, 0xb2,
- 0x6c, 0x93, 0xb6, 0x14, 0x5b, 0x76, 0xec, 0xa4, 0x0a, 0x04, 0xa1, 0x80, 0x14, 0x45, 0xd2, 0x4b,
- 0x90, 0x2e, 0xc7, 0xb1, 0xb7, 0x96, 0xc0, 0x90, 0x58, 0x0b, 0xc0, 0xae, 0x77, 0x17, 0x14, 0xe8,
- 0x6b, 0xe2, 0xaa, 0x94, 0x4f, 0xfe, 0x07, 0x7c, 0x4b, 0x8e, 0xb9, 0xe7, 0x94, 0x54, 0x4e, 0x71,
- 0x2a, 0x17, 0x1f, 0x53, 0x95, 0x8a, 0xe2, 0x92, 0x6f, 0xb9, 0xf9, 0xf4, 0x5d, 0xbe, 0xc3, 0x57,
- 0xf3, 0xd8, 0x27, 0xb0, 0x78, 0x58, 0xae, 0xfa, 0xea, 0xbb, 0x61, 0x7a, 0xba, 0x7b, 0xe7, 0xd1,
- 0xd3, 0xdd, 0xf3, 0xeb, 0x01, 0xdc, 0xb0, 0xf1, 0xa0, 0x83, 0xcd, 0xbe, 0x36, 0xb0, 0x37, 0xd5,
- 0xd3, 0xb6, 0xb6, 0x69, 0x5f, 0x1a, 0xd8, 0xda, 0x30, 0x4c, 0xdd, 0xd6, 0x51, 0xd9, 0xeb, 0xdc,
- 0x20, 0x9d, 0xd5, 0x5b, 0x3e, 0xee, 0xb6, 0x79, 0x69, 0xd8, 0xfa, 0xa6, 0x61, 0xea, 0xfa, 0x19,
- 0xe3, 0xaf, 0xfa, 0x95, 0x51, 0x3d, 0x9b, 0x1d, 0xd5, 0xea, 0xf2, 0xce, 0x9b, 0x63, 0x9d, 0xa7,
- 0x3d, 0xbd, 0xfd, 0x34, 0xb2, 0xd7, 0x37, 0x90, 0x40, 0x2f, 0xff, 0xee, 0x53, 0x7c, 0xe9, 0xf4,
- 0xde, 0x1a, 0x93, 0x35, 0x54, 0x53, 0xed, 0x3b, 0xdd, 0xab, 0xbe, 0xee, 0x0b, 0x6c, 0x5a, 0x9a,
- 0x3e, 0x08, 0x28, 0x5f, 0x3b, 0xd7, 0xf5, 0xf3, 0x1e, 0xde, 0xa4, 0xad, 0xd3, 0xe1, 0xd9, 0xa6,
- 0xad, 0xf5, 0xb1, 0x65, 0xab, 0x7d, 0x83, 0x33, 0xac, 0x9c, 0xeb, 0xe7, 0x3a, 0xfd, 0xb9, 0x49,
- 0x7e, 0x31, 0xaa, 0xf4, 0x4d, 0x0e, 0x32, 0x32, 0xfe, 0x6a, 0x88, 0x2d, 0x1b, 0xdd, 0x87, 0x24,
- 0x6e, 0x77, 0xf5, 0x8a, 0xb0, 0x2e, 0xdc, 0xcd, 0xdf, 0xbf, 0xb9, 0x11, 0x5a, 0xb7, 0x0d, 0xce,
- 0xd7, 0x68, 0x77, 0xf5, 0x66, 0x4c, 0xa6, 0xbc, 0xe8, 0x5d, 0x48, 0x9d, 0xf5, 0x86, 0x56, 0xb7,
- 0x12, 0xa7, 0x42, 0xb7, 0xa2, 0x84, 0x1e, 0x11, 0xa6, 0x66, 0x4c, 0x66, 0xdc, 0xe4, 0x53, 0xda,
- 0xe0, 0x4c, 0xaf, 0x24, 0xa6, 0x7f, 0x6a, 0x67, 0x70, 0x46, 0x3f, 0x45, 0x78, 0xd1, 0x16, 0x80,
- 0x36, 0xd0, 0x6c, 0xa5, 0xdd, 0x55, 0xb5, 0x41, 0x25, 0x49, 0x25, 0x5f, 0x89, 0x96, 0xd4, 0xec,
- 0x3a, 0x61, 0x6c, 0xc6, 0xe4, 0x9c, 0xe6, 0x34, 0xc8, 0x70, 0xbf, 0x1a, 0x62, 0xf3, 0xb2, 0x92,
- 0x9a, 0x3e, 0xdc, 0x8f, 0x09, 0x13, 0x19, 0x2e, 0xe5, 0x46, 0x1f, 0x41, 0xb6, 0xdd, 0xc5, 0xed,
- 0xa7, 0x8a, 0x3d, 0xaa, 0x64, 0xa8, 0xe4, 0x5a, 0x94, 0x64, 0x9d, 0xf0, 0xb5, 0x46, 0xcd, 0x98,
- 0x9c, 0x69, 0xb3, 0x9f, 0x68, 0x1f, 0x4a, 0x3d, 0xcd, 0xb2, 0x15, 0x6b, 0xa0, 0x1a, 0x56, 0x57,
- 0xb7, 0xad, 0x4a, 0x9e, 0xea, 0x78, 0x35, 0x4a, 0xc7, 0x9e, 0x66, 0xd9, 0x47, 0x0e, 0x73, 0x33,
- 0x26, 0x17, 0x7b, 0x7e, 0x02, 0xd1, 0xa7, 0x9f, 0x9d, 0x61, 0xd3, 0x55, 0x58, 0x29, 0x4c, 0xd7,
- 0x77, 0x40, 0xb8, 0x1d, 0x79, 0xa2, 0x4f, 0xf7, 0x13, 0xd0, 0x67, 0xb0, 0xdc, 0xd3, 0xd5, 0x8e,
- 0xab, 0x4e, 0x69, 0x77, 0x87, 0x83, 0xa7, 0x95, 0x22, 0x55, 0xfa, 0x7a, 0xe4, 0x20, 0x75, 0xb5,
- 0xe3, 0xa8, 0xa8, 0x13, 0x81, 0x66, 0x4c, 0x5e, 0xea, 0x85, 0x89, 0xe8, 0x0b, 0x58, 0x51, 0x0d,
- 0xa3, 0x77, 0x19, 0xd6, 0x5e, 0xa2, 0xda, 0xef, 0x45, 0x69, 0xaf, 0x11, 0x99, 0xb0, 0x7a, 0xa4,
- 0x8e, 0x51, 0x51, 0x0b, 0x44, 0xc3, 0xc4, 0x86, 0x6a, 0x62, 0xc5, 0x30, 0x75, 0x43, 0xb7, 0xd4,
- 0x5e, 0xa5, 0x4c, 0x75, 0xdf, 0x89, 0xd2, 0x7d, 0xc8, 0xf8, 0x0f, 0x39, 0x7b, 0x33, 0x26, 0x97,
- 0x8d, 0x20, 0x89, 0x69, 0xd5, 0xdb, 0xd8, 0xb2, 0x3c, 0xad, 0xe2, 0x2c, 0xad, 0x94, 0x3f, 0xa8,
- 0x35, 0x40, 0x42, 0x0d, 0xc8, 0xe3, 0x11, 0x11, 0x57, 0x2e, 0x74, 0x1b, 0x57, 0x96, 0xa8, 0x42,
- 0x29, 0xf2, 0x9c, 0x51, 0xd6, 0x13, 0xdd, 0xc6, 0xcd, 0x98, 0x0c, 0xd8, 0x6d, 0x21, 0x15, 0xae,
- 0x5c, 0x60, 0x53, 0x3b, 0xbb, 0xa4, 0x6a, 0x14, 0xda, 0x43, 0xfc, 0x41, 0x05, 0x51, 0x85, 0x6f,
- 0x44, 0x29, 0x3c, 0xa1, 0x42, 0x44, 0x45, 0xc3, 0x11, 0x69, 0xc6, 0xe4, 0xe5, 0x8b, 0x71, 0x32,
- 0x31, 0xb1, 0x33, 0x6d, 0xa0, 0xf6, 0xb4, 0xaf, 0xb1, 0x42, 0x1d, 0x5c, 0x65, 0x79, 0xba, 0x89,
- 0x3d, 0xe2, 0xdc, 0x5b, 0x84, 0x99, 0x98, 0xd8, 0x99, 0x9f, 0xb0, 0x95, 0x81, 0xd4, 0x85, 0xda,
- 0x1b, 0xe2, 0xdd, 0x64, 0x36, 0x2d, 0x66, 0x76, 0x93, 0xd9, 0xac, 0x98, 0xdb, 0x4d, 0x66, 0x73,
- 0x22, 0xec, 0x26, 0xb3, 0x20, 0xe6, 0xa5, 0x3b, 0x90, 0xf7, 0xb9, 0x17, 0x54, 0x81, 0x4c, 0x1f,
- 0x5b, 0x96, 0x7a, 0x8e, 0xa9, 0x37, 0xca, 0xc9, 0x4e, 0x53, 0x2a, 0x41, 0xc1, 0xef, 0x52, 0xa4,
- 0xef, 0x04, 0x57, 0x92, 0x78, 0x0b, 0x22, 0xc9, 0xdd, 0xa3, 0x23, 0xc9, 0x9b, 0xe8, 0x36, 0x14,
- 0xe9, 0x54, 0x14, 0xa7, 0x9f, 0xb8, 0xac, 0xa4, 0x5c, 0xa0, 0xc4, 0x13, 0xce, 0xb4, 0x06, 0x79,
- 0xe3, 0xbe, 0xe1, 0xb2, 0x24, 0x28, 0x0b, 0x18, 0xf7, 0x0d, 0x87, 0xe1, 0x15, 0x28, 0x90, 0x79,
- 0xbb, 0x1c, 0x49, 0xfa, 0x91, 0x3c, 0xa1, 0x71, 0x16, 0xe9, 0xef, 0x13, 0x20, 0x86, 0xdd, 0x10,
- 0x7a, 0x1f, 0x92, 0xc4, 0x23, 0x73, 0xe7, 0x5a, 0xdd, 0x60, 0xee, 0x7a, 0xc3, 0x71, 0xd7, 0x1b,
- 0x2d, 0xc7, 0x5d, 0x6f, 0x65, 0x7f, 0x78, 0xbe, 0x16, 0xfb, 0xee, 0xff, 0xd6, 0x04, 0x99, 0x4a,
- 0xa0, 0xeb, 0xc4, 0xf9, 0xa8, 0xda, 0x40, 0xd1, 0x3a, 0x74, 0xc8, 0x39, 0xe2, 0x59, 0x54, 0x6d,
- 0xb0, 0xd3, 0x41, 0x7b, 0x20, 0xb6, 0xf5, 0x81, 0x85, 0x07, 0xd6, 0xd0, 0x52, 0x58, 0xb8, 0xe0,
- 0x2e, 0x35, 0xe0, 0x18, 0x59, 0x9c, 0xa8, 0x3b, 0x9c, 0x87, 0x94, 0x51, 0x2e, 0xb7, 0x83, 0x04,
- 0xb4, 0x0f, 0xc5, 0x0b, 0xb5, 0xa7, 0x75, 0x54, 0x5b, 0x37, 0x15, 0x0b, 0xdb, 0xdc, 0xc7, 0xde,
- 0x1e, 0xdb, 0xf3, 0x13, 0x87, 0xeb, 0x08, 0xdb, 0xc7, 0x46, 0x47, 0xb5, 0xf1, 0x56, 0xf2, 0x87,
- 0xe7, 0x6b, 0x82, 0x5c, 0xb8, 0xf0, 0xf5, 0xa0, 0xd7, 0xa0, 0xac, 0x1a, 0x86, 0x62, 0xd9, 0xaa,
- 0x8d, 0x95, 0xd3, 0x4b, 0x1b, 0x5b, 0xd4, 0xed, 0x16, 0xe4, 0xa2, 0x6a, 0x18, 0x47, 0x84, 0xba,
- 0x45, 0x88, 0xe8, 0x55, 0x28, 0x11, 0x0f, 0xad, 0xa9, 0x3d, 0xa5, 0x8b, 0xb5, 0xf3, 0xae, 0x5d,
- 0x49, 0xaf, 0x0b, 0x77, 0x13, 0x72, 0x91, 0x53, 0x9b, 0x94, 0x88, 0x36, 0x60, 0xd9, 0x61, 0x6b,
- 0xeb, 0x26, 0x76, 0x78, 0x89, 0x3f, 0x2e, 0xca, 0x4b, 0xbc, 0xab, 0xae, 0x9b, 0x98, 0xf1, 0x4b,
- 0x1d, 0xd7, 0x52, 0xa8, 0x37, 0x47, 0x08, 0x92, 0x1d, 0xd5, 0x56, 0xe9, 0x0e, 0x14, 0x64, 0xfa,
- 0x9b, 0xd0, 0x0c, 0xd5, 0xee, 0xf2, 0x75, 0xa5, 0xbf, 0xd1, 0x55, 0x48, 0x73, 0xd5, 0x09, 0x3a,
- 0x0c, 0xde, 0x42, 0x2b, 0x90, 0x32, 0x4c, 0xfd, 0x02, 0xd3, 0x65, 0xc9, 0xca, 0xac, 0x21, 0xc9,
- 0x50, 0x0a, 0x7a, 0x7e, 0x54, 0x82, 0xb8, 0x3d, 0xe2, 0x5f, 0x89, 0xdb, 0x23, 0xf4, 0x36, 0x24,
- 0xc9, 0x06, 0xd0, 0x6f, 0x94, 0x26, 0xc4, 0x3a, 0x2e, 0xd7, 0xba, 0x34, 0xb0, 0x4c, 0x39, 0xa5,
- 0xab, 0xb0, 0x32, 0x29, 0x12, 0x48, 0x5d, 0x97, 0x1e, 0xf0, 0xe8, 0xe8, 0x5d, 0xc8, 0xba, 0xa1,
- 0x80, 0xd9, 0xd7, 0xf5, 0xb1, 0xaf, 0x38, 0xcc, 0xb2, 0xcb, 0x4a, 0x0c, 0x8b, 0xec, 0x4f, 0x57,
- 0xe5, 0xe1, 0xbb, 0x20, 0x67, 0x54, 0xc3, 0x68, 0xaa, 0x56, 0x57, 0x3a, 0x87, 0x4a, 0x94, 0x9b,
- 0xf7, 0xad, 0x8f, 0x40, 0x4f, 0x87, 0xb3, 0x3e, 0xbe, 0x93, 0x17, 0xa7, 0x7b, 0xe2, 0x9e, 0x3c,
- 0x6a, 0xc1, 0xc3, 0xc1, 0x53, 0x62, 0xc1, 0x09, 0xf6, 0x21, 0xda, 0xde, 0xe9, 0x48, 0x1d, 0xb8,
- 0x1e, 0xe9, 0xf1, 0x03, 0x72, 0x42, 0x40, 0x8e, 0x6c, 0x06, 0x8b, 0x23, 0x6c, 0xe0, 0xac, 0x41,
- 0x86, 0x66, 0xd1, 0x79, 0xd3, 0xcf, 0xe4, 0x64, 0xde, 0x92, 0x7e, 0x49, 0xc2, 0xd5, 0xc9, 0xce,
- 0x1f, 0xad, 0x43, 0xa1, 0xaf, 0x8e, 0x14, 0x7b, 0xc4, 0x2d, 0x54, 0xa0, 0x7b, 0x0e, 0x7d, 0x75,
- 0xd4, 0x1a, 0x31, 0xf3, 0x14, 0x21, 0x61, 0x8f, 0xac, 0x4a, 0x7c, 0x3d, 0x71, 0xb7, 0x20, 0x93,
- 0x9f, 0xe8, 0x09, 0x2c, 0xf5, 0xf4, 0xb6, 0xda, 0x53, 0x7a, 0xaa, 0x65, 0x2b, 0x6d, 0xbd, 0xdf,
- 0xd7, 0x6c, 0x7e, 0xee, 0x6e, 0x8c, 0x6f, 0x2f, 0xed, 0x26, 0xbe, 0x89, 0x1e, 0x92, 0x98, 0x5c,
- 0xa6, 0xb2, 0x7b, 0xaa, 0x65, 0xb3, 0x2e, 0xb4, 0x0d, 0xf9, 0xbe, 0x66, 0x9d, 0xe2, 0xae, 0x7a,
- 0xa1, 0xe9, 0x66, 0x25, 0xb9, 0x9e, 0x98, 0x98, 0x13, 0x3d, 0xf1, 0x78, 0xb8, 0x26, 0xbf, 0x98,
- 0x6f, 0x5b, 0x52, 0x01, 0xb3, 0x75, 0x1c, 0x4f, 0x7a, 0x61, 0xc7, 0xf3, 0x36, 0xac, 0x0c, 0xf0,
- 0xc8, 0x56, 0xdc, 0x43, 0x6d, 0x31, 0x5b, 0xc9, 0xd0, 0x25, 0x47, 0xa4, 0xcf, 0xf5, 0x04, 0x16,
- 0x31, 0x1b, 0xb2, 0x2b, 0xa6, 0x3e, 0x1c, 0x74, 0x2a, 0xd9, 0x75, 0xe1, 0x6e, 0x4a, 0x66, 0x0d,
- 0xf4, 0x10, 0x2a, 0xf4, 0xc0, 0x32, 0x2f, 0x46, 0xbc, 0x2d, 0xee, 0x38, 0xa7, 0x37, 0x47, 0x2d,
- 0xe5, 0x0a, 0xe9, 0xa7, 0x7e, 0x72, 0x8f, 0xf6, 0xf2, 0x13, 0xbf, 0x09, 0x2b, 0x2c, 0xfa, 0x62,
- 0x93, 0x84, 0x61, 0xb2, 0x49, 0x74, 0x00, 0x40, 0x07, 0xb0, 0xe4, 0xf4, 0x1d, 0x9a, 0x7a, 0x6b,
- 0x44, 0xbf, 0xff, 0xb6, 0x2b, 0xd0, 0x51, 0x88, 0x69, 0x3b, 0xf6, 0x98, 0xa7, 0x86, 0x8a, 0x9c,
- 0xbe, 0x9a, 0xe1, 0xba, 0xf3, 0x87, 0x9e, 0xd1, 0x16, 0xc6, 0x53, 0x42, 0xde, 0xe5, 0xb9, 0x4e,
- 0xcf, 0xa6, 0xd7, 0x20, 0xff, 0xd5, 0x50, 0x37, 0x87, 0x7d, 0x36, 0xa4, 0x22, 0x1d, 0x12, 0x30,
- 0x12, 0x3d, 0x42, 0xff, 0x96, 0xf2, 0xd9, 0x5c, 0x30, 0x0f, 0xe0, 0x16, 0x25, 0x78, 0x16, 0x75,
- 0xe4, 0x1b, 0xb8, 0xdf, 0xa8, 0xe2, 0xf3, 0x1a, 0x95, 0x3b, 0xb7, 0x68, 0xbb, 0x4a, 0xfc, 0x3a,
- 0xbb, 0x42, 0x90, 0xa4, 0x33, 0x4c, 0x32, 0xb7, 0x49, 0x7e, 0x47, 0xda, 0x9a, 0xbb, 0xff, 0x69,
- 0xff, 0xfe, 0x3b, 0x16, 0x98, 0xf9, 0xcd, 0x2c, 0x30, 0x1b, 0x69, 0x81, 0xbf, 0xda, 0xd6, 0x5a,
- 0x70, 0x35, 0x24, 0xa8, 0x0c, 0x69, 0x68, 0xa3, 0xd6, 0x16, 0x4a, 0xf8, 0x9d, 0x80, 0xea, 0x53,
- 0x24, 0x2f, 0x07, 0xf4, 0xb2, 0xb0, 0x18, 0x69, 0xc1, 0xf9, 0x45, 0x2d, 0xb8, 0x30, 0x8f, 0x05,
- 0x17, 0x5f, 0xc6, 0x82, 0x4b, 0x63, 0x16, 0x7c, 0x0c, 0x4b, 0x63, 0xa9, 0xa8, 0x6b, 0x0e, 0xc2,
- 0x44, 0x73, 0x88, 0x4f, 0x36, 0x87, 0x84, 0xcf, 0x1c, 0xa4, 0x9f, 0x04, 0xa8, 0x46, 0x67, 0xa4,
- 0x13, 0x3f, 0xf0, 0x0e, 0x5c, 0xf1, 0x32, 0x13, 0xff, 0x3a, 0x32, 0xef, 0x8f, 0xdc, 0x4e, 0x6f,
- 0x21, 0xa7, 0x44, 0x71, 0x36, 0xa6, 0xa4, 0xdf, 0x44, 0x9f, 0x40, 0x39, 0x98, 0x4b, 0x93, 0x54,
- 0x85, 0x1c, 0x97, 0x3f, 0x1b, 0x3b, 0x2e, 0xde, 0x5a, 0xb8, 0x63, 0x96, 0x4b, 0x17, 0xfe, 0xa6,
- 0x25, 0xfd, 0x57, 0xdc, 0x8d, 0xd4, 0x81, 0xc4, 0x18, 0x7d, 0x00, 0x69, 0x7e, 0xb2, 0x85, 0x79,
- 0x4f, 0x36, 0x17, 0x08, 0x9f, 0xe6, 0xf8, 0xcb, 0x9d, 0xe6, 0xc4, 0xc4, 0xed, 0x4b, 0x4e, 0x5e,
- 0xaa, 0x94, 0x7f, 0xa9, 0xde, 0x82, 0x14, 0xbb, 0x11, 0xb0, 0x80, 0x72, 0x6d, 0xfc, 0x5c, 0xd0,
- 0xa9, 0xca, 0x8c, 0x0b, 0xd5, 0x20, 0xcb, 0xb2, 0x6e, 0xad, 0xc3, 0x1d, 0xc0, 0xf5, 0x08, 0x89,
- 0x9d, 0xed, 0xad, 0xfc, 0x8b, 0xe7, 0x6b, 0x19, 0xde, 0x90, 0x33, 0x54, 0x6e, 0xa7, 0x23, 0xfd,
- 0x7b, 0x0e, 0xb2, 0x32, 0xb6, 0x0c, 0x62, 0xc2, 0x68, 0x0b, 0x72, 0x78, 0xd4, 0xc6, 0x86, 0xed,
- 0x64, 0xf8, 0x93, 0x6f, 0x50, 0x8c, 0xbb, 0xe1, 0x70, 0x36, 0x63, 0xb2, 0x27, 0x86, 0x1e, 0x70,
- 0xa0, 0x23, 0x1a, 0xb3, 0xe0, 0xe2, 0x7e, 0xa4, 0xe3, 0x3d, 0x07, 0xe9, 0x60, 0x81, 0x7e, 0x35,
- 0x52, 0x2a, 0x04, 0x75, 0x3c, 0xe0, 0x50, 0x47, 0x72, 0xc6, 0xc7, 0x02, 0x58, 0x47, 0x3d, 0x80,
- 0x75, 0xa4, 0x66, 0x4c, 0x33, 0x02, 0xec, 0x78, 0xcf, 0x01, 0x3b, 0xd2, 0x33, 0x46, 0x1c, 0x42,
- 0x3b, 0xfe, 0x72, 0x0c, 0xed, 0x58, 0x8f, 0x14, 0x9d, 0x00, 0x77, 0x1c, 0x8c, 0xc1, 0x1d, 0x59,
- 0xaa, 0xe4, 0xb5, 0x48, 0x25, 0x33, 0xf0, 0x8e, 0x83, 0x31, 0xbc, 0x23, 0x37, 0x43, 0xe1, 0x0c,
- 0xc0, 0xe3, 0x6f, 0x27, 0x03, 0x1e, 0x10, 0x09, 0x49, 0xf0, 0x61, 0xce, 0x87, 0x78, 0x28, 0x11,
- 0x88, 0x47, 0x3e, 0xf2, 0x76, 0xce, 0xd4, 0xcf, 0x0d, 0x79, 0x1c, 0x4f, 0x80, 0x3c, 0x58, 0xf2,
- 0x72, 0x37, 0x52, 0xf9, 0x1c, 0x98, 0xc7, 0xf1, 0x04, 0xcc, 0xa3, 0x38, 0x53, 0xed, 0x4c, 0xd0,
- 0xe3, 0x51, 0x10, 0xf4, 0x28, 0x45, 0xdc, 0x29, 0xbd, 0x23, 0x1b, 0x81, 0x7a, 0x9c, 0x46, 0xa1,
- 0x1e, 0x0c, 0xed, 0x79, 0x33, 0x52, 0xe3, 0x02, 0xb0, 0xc7, 0xc1, 0x18, 0xec, 0x21, 0xce, 0xb0,
- 0xb4, 0x39, 0x71, 0x0f, 0xe9, 0x75, 0x12, 0x4b, 0x43, 0x4e, 0x89, 0x38, 0x58, 0x6c, 0x9a, 0xba,
- 0xc9, 0x91, 0x0a, 0xd6, 0x90, 0xee, 0x92, 0x7b, 0xab, 0xe7, 0x80, 0xa6, 0x60, 0x21, 0x65, 0x28,
- 0x06, 0x9c, 0x8e, 0xf4, 0x2f, 0x82, 0x27, 0x4b, 0xd1, 0x10, 0xff, 0x9d, 0x37, 0xc7, 0xef, 0xbc,
- 0xa1, 0x7b, 0x5a, 0x2e, 0x90, 0x11, 0xf8, 0x73, 0x0e, 0x0e, 0x7e, 0xa8, 0x5e, 0xae, 0x71, 0x0f,
- 0x96, 0x68, 0x76, 0xca, 0x3c, 0x7a, 0x20, 0x68, 0x94, 0x49, 0x07, 0x5b, 0x05, 0x16, 0x3d, 0xde,
- 0x82, 0x65, 0x1f, 0xaf, 0x7b, 0xd1, 0x64, 0x08, 0x80, 0xe8, 0x72, 0xd7, 0xf8, 0x8d, 0xf3, 0x3f,
- 0x12, 0xde, 0x0a, 0x79, 0xa8, 0xc9, 0x24, 0x80, 0x43, 0xf8, 0xd5, 0x00, 0x47, 0xf4, 0x85, 0x17,
- 0x7d, 0x06, 0x2b, 0x01, 0xec, 0xc3, 0x49, 0xfe, 0x12, 0x8b, 0x41, 0x20, 0x31, 0x5f, 0x2e, 0xe2,
- 0xf6, 0xa0, 0xcf, 0xe1, 0x06, 0x4d, 0x63, 0x23, 0x12, 0xcc, 0xe4, 0x7c, 0x09, 0xe6, 0x35, 0xa2,
- 0xa3, 0x3e, 0x21, 0xc9, 0x8c, 0x00, 0x46, 0x52, 0x11, 0xc0, 0x08, 0xda, 0x83, 0xc2, 0x39, 0x1e,
- 0x60, 0x4b, 0xb3, 0x94, 0x05, 0x6e, 0x86, 0x02, 0xc9, 0xcb, 0x9b, 0x31, 0x39, 0xcf, 0x65, 0x49,
- 0xef, 0x3f, 0x08, 0xc2, 0x56, 0x19, 0x8a, 0x8a, 0x5f, 0x9d, 0xf4, 0x3b, 0xc1, 0x33, 0x4b, 0x17,
- 0x79, 0x69, 0xeb, 0x1d, 0x66, 0xbe, 0x45, 0x99, 0xfe, 0x26, 0x77, 0xa0, 0x9e, 0x7e, 0xce, 0x2d,
- 0x90, 0xfc, 0x24, 0x5c, 0x6e, 0x4d, 0x20, 0xc7, 0xe3, 0xe0, 0x0a, 0xa4, 0xb4, 0x41, 0x07, 0x8f,
- 0xb8, 0x91, 0xb1, 0x06, 0x91, 0x7d, 0x8a, 0x2f, 0xb9, 0x29, 0x91, 0x9f, 0x84, 0x8f, 0x9e, 0x33,
- 0x3a, 0x97, 0x82, 0xcc, 0x1a, 0xe8, 0x7d, 0xc8, 0xd1, 0xc2, 0x8e, 0xa2, 0x1b, 0x16, 0x8f, 0x64,
- 0x81, 0x84, 0x8b, 0x15, 0x61, 0x36, 0x0e, 0x09, 0xcf, 0x81, 0x61, 0xc9, 0x59, 0x83, 0xff, 0xf2,
- 0xa5, 0x44, 0xd9, 0x40, 0x4a, 0x74, 0x13, 0x72, 0x64, 0xf4, 0x96, 0xa1, 0xb6, 0x31, 0x8d, 0x42,
- 0x39, 0xd9, 0x23, 0x48, 0xff, 0x2a, 0x40, 0x39, 0x14, 0x18, 0x27, 0xce, 0xdd, 0x39, 0x95, 0xf1,
- 0x20, 0x12, 0x35, 0x36, 0xfb, 0x5b, 0x00, 0xe7, 0xaa, 0xa5, 0x3c, 0x53, 0x07, 0x36, 0xee, 0xf0,
- 0x25, 0xc8, 0x9d, 0xab, 0xd6, 0x27, 0x94, 0x10, 0x1c, 0x4c, 0x2a, 0x34, 0x18, 0x1f, 0x16, 0x92,
- 0xf6, 0x63, 0x21, 0xa8, 0x0a, 0x59, 0xc3, 0xd4, 0x74, 0x53, 0xb3, 0x2f, 0xe9, 0x9a, 0x24, 0x64,
- 0xb7, 0x2d, 0x1d, 0xc2, 0x95, 0x89, 0x31, 0x19, 0x3d, 0x84, 0x9c, 0x17, 0xce, 0x05, 0x9a, 0x7a,
- 0x4e, 0x81, 0x98, 0x3c, 0x5e, 0xb2, 0x24, 0x57, 0x26, 0x46, 0x65, 0xd4, 0x80, 0xb4, 0x89, 0xad,
- 0x61, 0x8f, 0xa5, 0xc2, 0xa5, 0xfb, 0x6f, 0xcd, 0x17, 0xcd, 0x09, 0x75, 0xd8, 0xb3, 0x65, 0x2e,
- 0x2c, 0x7d, 0x01, 0x69, 0x46, 0x41, 0x79, 0xc8, 0x1c, 0xef, 0x3f, 0xde, 0x3f, 0xf8, 0x64, 0x5f,
- 0x8c, 0x21, 0x80, 0x74, 0xad, 0x5e, 0x6f, 0x1c, 0xb6, 0x44, 0x01, 0xe5, 0x20, 0x55, 0xdb, 0x3a,
- 0x90, 0x5b, 0x62, 0x9c, 0x90, 0xe5, 0xc6, 0x6e, 0xa3, 0xde, 0x12, 0x13, 0x68, 0x09, 0x8a, 0xec,
- 0xb7, 0xf2, 0xe8, 0x40, 0x7e, 0x52, 0x6b, 0x89, 0x49, 0x1f, 0xe9, 0xa8, 0xb1, 0xbf, 0xdd, 0x90,
- 0xc5, 0x94, 0xf4, 0x0e, 0x5c, 0x8f, 0x8c, 0xff, 0x1e, 0x0a, 0x25, 0xf8, 0x50, 0x28, 0xe9, 0xc7,
- 0x38, 0xb9, 0xe0, 0x44, 0x05, 0x75, 0xb4, 0x1b, 0x9a, 0xf8, 0xfd, 0x05, 0x32, 0x82, 0xd0, 0xec,
- 0xd1, 0xab, 0x50, 0x32, 0xf1, 0x19, 0xb6, 0xdb, 0x5d, 0x96, 0x64, 0x38, 0x30, 0x55, 0x91, 0x53,
- 0xa9, 0x90, 0xc5, 0xd8, 0xbe, 0xc4, 0x6d, 0x5b, 0x61, 0x46, 0x60, 0x51, 0x30, 0x20, 0x47, 0xd8,
- 0x08, 0xf5, 0x88, 0x11, 0x89, 0xff, 0x67, 0x7e, 0x8a, 0xa9, 0x4a, 0x52, 0x55, 0x40, 0xdd, 0x0e,
- 0xa5, 0x48, 0xcf, 0x16, 0x5a, 0xec, 0x1c, 0xa4, 0xe4, 0x46, 0x4b, 0xfe, 0x54, 0x4c, 0x20, 0x04,
- 0x25, 0xfa, 0x53, 0x39, 0xda, 0xaf, 0x1d, 0x1e, 0x35, 0x0f, 0xc8, 0x62, 0x2f, 0x43, 0xd9, 0x59,
- 0x6c, 0x87, 0x98, 0x42, 0x57, 0x60, 0xa9, 0x7e, 0xf0, 0xe4, 0x70, 0xaf, 0xd1, 0x6a, 0x78, 0xe4,
- 0xb4, 0xf4, 0x3f, 0x09, 0xb8, 0x16, 0x91, 0xca, 0xa0, 0xf7, 0x01, 0xec, 0x91, 0x62, 0xe2, 0xb6,
- 0x6e, 0x76, 0xa2, 0x8d, 0xb3, 0x35, 0x92, 0x29, 0x87, 0x9c, 0xb3, 0xf9, 0xaf, 0xa9, 0xf1, 0xe0,
- 0x23, 0xae, 0x94, 0x4c, 0xd6, 0xe2, 0xd0, 0xc9, 0xad, 0x09, 0x77, 0x41, 0xdc, 0x26, 0x8a, 0xe9,
- 0x9e, 0x50, 0xc5, 0x94, 0x1f, 0x7d, 0x0a, 0xd7, 0x42, 0x61, 0x8b, 0xfb, 0x7a, 0x6b, 0x52, 0xdd,
- 0x72, 0x72, 0xf4, 0xba, 0x12, 0x8c, 0x5e, 0xcc, 0xd7, 0x5b, 0x53, 0x70, 0x8a, 0xd4, 0x4b, 0xe0,
- 0x14, 0x51, 0xe1, 0x2f, 0xbd, 0x68, 0x05, 0x60, 0x52, 0xf8, 0x0b, 0xa5, 0x15, 0x99, 0x70, 0x5a,
- 0x21, 0xfd, 0x3e, 0xb0, 0xbb, 0xc1, 0xf4, 0xf1, 0x00, 0xd2, 0x96, 0xad, 0xda, 0x43, 0x8b, 0x9f,
- 0x96, 0x87, 0xf3, 0xe6, 0xa2, 0x1b, 0xce, 0x8f, 0x23, 0x2a, 0x2e, 0x73, 0x35, 0x7f, 0x92, 0x9b,
- 0x1e, 0xb5, 0x3d, 0xa9, 0xdf, 0x62, 0x7b, 0x9a, 0x90, 0xc6, 0x17, 0x78, 0x60, 0x5b, 0x95, 0x34,
- 0x9d, 0xf1, 0xd5, 0xf1, 0x19, 0x93, 0xee, 0xad, 0x0a, 0xc9, 0x6f, 0xfe, 0xff, 0xf9, 0x9a, 0xc8,
- 0xb8, 0xdf, 0xd4, 0xfb, 0x9a, 0x8d, 0xfb, 0x86, 0x7d, 0x29, 0x73, 0x79, 0xe9, 0x5d, 0x28, 0x05,
- 0x17, 0x3d, 0xda, 0x4d, 0x78, 0x8e, 0x38, 0x2e, 0xfd, 0xb3, 0x00, 0xcb, 0x13, 0x50, 0x15, 0xf4,
- 0x90, 0x17, 0x4e, 0xd8, 0xc6, 0xdf, 0x1e, 0x5f, 0xbd, 0x00, 0xbb, 0x57, 0x3f, 0x21, 0x81, 0xd1,
- 0xbb, 0x1e, 0xb0, 0x3d, 0xf6, 0x08, 0xe8, 0x0d, 0x28, 0x5b, 0xda, 0xf9, 0x40, 0x31, 0x19, 0x40,
- 0xe3, 0x16, 0x25, 0x48, 0xf6, 0x4e, 0x3a, 0x9c, 0xd2, 0x5d, 0x87, 0x64, 0x37, 0x08, 0x44, 0x25,
- 0xc4, 0x2d, 0xb5, 0x01, 0x8d, 0xdf, 0x56, 0x26, 0x41, 0x48, 0xc2, 0x4b, 0x40, 0x48, 0xff, 0x24,
- 0xc0, 0x8d, 0x29, 0x37, 0x18, 0xf4, 0x71, 0xe8, 0x5c, 0x7c, 0xb0, 0xc8, 0xfd, 0x67, 0x83, 0xd1,
- 0x82, 0x27, 0x43, 0x7a, 0x00, 0x05, 0x3f, 0x7d, 0xbe, 0xcd, 0xdb, 0xf5, 0xe2, 0x7b, 0x10, 0xea,
- 0xba, 0x0d, 0x45, 0x13, 0xdb, 0xc4, 0x49, 0x05, 0xb0, 0xc1, 0x02, 0x23, 0xb2, 0x54, 0x74, 0x37,
- 0x99, 0x15, 0xc4, 0xb8, 0x6b, 0x3f, 0xff, 0x29, 0x00, 0x78, 0xf8, 0x97, 0x87, 0x3f, 0x09, 0x7e,
- 0xfc, 0x29, 0x04, 0x5b, 0xc6, 0xc3, 0xb0, 0x25, 0xba, 0x03, 0x65, 0x76, 0xe7, 0x20, 0xfb, 0xa6,
- 0xda, 0x43, 0x13, 0x73, 0xb4, 0xab, 0x44, 0xc9, 0x47, 0x0e, 0x15, 0x7d, 0x06, 0xd7, 0xed, 0xae,
- 0x89, 0xad, 0xae, 0xde, 0xeb, 0x28, 0xe1, 0xbd, 0x63, 0x55, 0x98, 0xb5, 0x19, 0x46, 0x27, 0x5f,
- 0x73, 0x35, 0x9c, 0x04, 0xf7, 0xef, 0x6b, 0x48, 0xd1, 0x63, 0x43, 0x12, 0x3b, 0xd7, 0x8a, 0x73,
- 0xdc, 0x40, 0x3f, 0x07, 0x50, 0x6d, 0xdb, 0xd4, 0x4e, 0x87, 0xc4, 0x3b, 0xc4, 0xc7, 0x3f, 0xe5,
- 0x1d, 0xbb, 0x9a, 0xc3, 0xb7, 0x75, 0x93, 0x9f, 0xbf, 0x15, 0x4f, 0xd4, 0x77, 0x06, 0x7d, 0x0a,
- 0xa5, 0x7d, 0x28, 0x05, 0x65, 0x9d, 0x8c, 0x99, 0x8d, 0x21, 0x98, 0x31, 0xb3, 0x0c, 0x9c, 0x67,
- 0xcc, 0x6e, 0xbe, 0x9d, 0x60, 0x35, 0x4e, 0xda, 0x90, 0x7e, 0x11, 0xa0, 0xe0, 0xf7, 0x7a, 0x73,
- 0x27, 0xb5, 0x3c, 0xc9, 0x4f, 0x8c, 0x27, 0xf9, 0x49, 0x5f, 0x9a, 0x7b, 0x1d, 0xb2, 0x24, 0xcd,
- 0x1d, 0x5a, 0xb8, 0xc3, 0x2b, 0xbf, 0x99, 0x73, 0xd5, 0x3a, 0xb6, 0x70, 0xc7, 0xe7, 0x9b, 0x32,
- 0x2f, 0xe7, 0x9b, 0x82, 0xc9, 0x72, 0x36, 0x94, 0x2c, 0xef, 0x26, 0xb3, 0x29, 0x31, 0x2d, 0xfb,
- 0xb2, 0x6d, 0xe9, 0x1b, 0x01, 0xb2, 0xee, 0x7c, 0x83, 0x25, 0xcf, 0x00, 0x42, 0xca, 0x96, 0x8b,
- 0x15, 0x3c, 0xf9, 0xf5, 0x84, 0x15, 0x80, 0x13, 0x6e, 0x01, 0xf8, 0x43, 0x37, 0xe1, 0x8b, 0xc2,
- 0x00, 0xfd, 0x8b, 0xeb, 0xc0, 0xbe, 0x3c, 0xbf, 0xfd, 0x47, 0x3e, 0x0e, 0x92, 0xb1, 0xa0, 0xbf,
- 0x80, 0xb4, 0xda, 0x76, 0x91, 0xcf, 0xd2, 0x04, 0x48, 0xd0, 0x61, 0xdd, 0x68, 0x8d, 0x6a, 0x94,
- 0x53, 0xe6, 0x12, 0x7c, 0x54, 0x71, 0x67, 0x54, 0xd2, 0x1e, 0xd1, 0xcb, 0x78, 0x82, 0x27, 0xbd,
- 0x04, 0x70, 0xbc, 0xff, 0xe4, 0x60, 0x7b, 0xe7, 0xd1, 0x4e, 0x63, 0x9b, 0x67, 0x74, 0xdb, 0xdb,
- 0x8d, 0x6d, 0x31, 0x4e, 0xf8, 0xe4, 0xc6, 0x93, 0x83, 0x93, 0xc6, 0xb6, 0x98, 0x20, 0x8d, 0xed,
- 0xc6, 0x5e, 0xed, 0xd3, 0xc6, 0xb6, 0x98, 0x94, 0x6a, 0x90, 0x73, 0x83, 0x0e, 0xad, 0x94, 0xeb,
- 0xcf, 0xb0, 0xc9, 0x57, 0x8b, 0x35, 0xd0, 0x2a, 0xe4, 0xc7, 0xa1, 0x7b, 0x72, 0x41, 0x63, 0x88,
- 0x3d, 0x09, 0x03, 0x65, 0x57, 0x07, 0x8f, 0x4d, 0x1f, 0x42, 0xc6, 0x18, 0x9e, 0x2a, 0x8e, 0xed,
- 0x86, 0x00, 0x6f, 0xe7, 0xfe, 0x36, 0x3c, 0xed, 0x69, 0xed, 0xc7, 0xf8, 0x92, 0x07, 0xb9, 0xb4,
- 0x31, 0x3c, 0x7d, 0xcc, 0x4c, 0x9c, 0x0d, 0x23, 0x3e, 0x65, 0x18, 0x89, 0xd0, 0x30, 0xd0, 0x1d,
- 0x28, 0x0c, 0xf4, 0x0e, 0x56, 0xd4, 0x4e, 0xc7, 0xc4, 0x16, 0x8b, 0xdd, 0x39, 0xae, 0x39, 0x4f,
- 0x7a, 0x6a, 0xac, 0x43, 0xfa, 0x49, 0x00, 0x34, 0x1e, 0x68, 0xd1, 0x11, 0x2c, 0x79, 0xb1, 0xda,
- 0x49, 0x00, 0x58, 0x24, 0x58, 0x8f, 0x0e, 0xd4, 0x01, 0x0c, 0x41, 0xbc, 0x08, 0x92, 0x49, 0xd6,
- 0xb7, 0xe2, 0xb9, 0x2a, 0x83, 0xce, 0x97, 0x2e, 0x4a, 0x7c, 0xce, 0x45, 0x89, 0xc9, 0xc8, 0x95,
- 0x77, 0x7b, 0xc2, 0xae, 0x34, 0x31, 0x56, 0x01, 0x32, 0xa0, 0xd2, 0x1a, 0x13, 0xe3, 0xf3, 0x8c,
- 0x1a, 0x92, 0xf0, 0x32, 0x43, 0x92, 0x1e, 0x80, 0xf8, 0xb1, 0xfb, 0x7d, 0x2f, 0x7f, 0xf4, 0x0f,
- 0x53, 0x18, 0x1b, 0xe6, 0x05, 0x64, 0x89, 0xf7, 0xa5, 0x41, 0xe3, 0xaf, 0x20, 0xe7, 0xae, 0x9e,
- 0xfb, 0xd8, 0x26, 0x72, 0xd9, 0xf9, 0x48, 0x3c, 0x11, 0x74, 0x0f, 0x96, 0x48, 0xdc, 0x70, 0xea,
- 0xb0, 0x0c, 0x05, 0x8c, 0x53, 0x6f, 0x58, 0x66, 0x1d, 0x7b, 0x0e, 0x74, 0x45, 0x62, 0xb4, 0xc8,
- 0x62, 0x39, 0xee, 0xfc, 0x31, 0x06, 0x40, 0xee, 0x75, 0x21, 0x30, 0x94, 0xed, 0x61, 0x31, 0x90,
- 0x4c, 0x48, 0x7f, 0x17, 0x87, 0xbc, 0xaf, 0x2e, 0x84, 0xfe, 0x3c, 0x90, 0x58, 0xad, 0x4f, 0xab,
- 0x21, 0xf9, 0xb2, 0xaa, 0xc0, 0xc4, 0xe2, 0x8b, 0x4f, 0x2c, 0xaa, 0x22, 0xe7, 0x94, 0x87, 0x93,
- 0x0b, 0x97, 0x87, 0xdf, 0x04, 0x64, 0xeb, 0xb6, 0xda, 0x23, 0xc1, 0x5b, 0x1b, 0x9c, 0x2b, 0xec,
- 0xb4, 0xb3, 0x92, 0xb4, 0x48, 0x7b, 0x4e, 0x68, 0xc7, 0x21, 0xa1, 0x4b, 0x3d, 0xc8, 0xba, 0xe0,
- 0xc3, 0xe2, 0x6f, 0x58, 0x26, 0x95, 0xc1, 0xab, 0x90, 0xed, 0x63, 0x5b, 0xa5, 0x61, 0x8f, 0x81,
- 0x51, 0x6e, 0xfb, 0xde, 0x07, 0x90, 0xf7, 0x3d, 0xec, 0x21, 0x91, 0x70, 0xbf, 0xf1, 0x89, 0x18,
- 0xab, 0x66, 0xbe, 0xfd, 0x7e, 0x3d, 0xb1, 0x8f, 0x9f, 0x91, 0x4f, 0xc9, 0x8d, 0x7a, 0xb3, 0x51,
- 0x7f, 0x2c, 0x0a, 0xd5, 0xfc, 0xb7, 0xdf, 0xaf, 0x67, 0x64, 0x4c, 0x4b, 0x28, 0xf7, 0x1e, 0x43,
- 0x39, 0xb4, 0x03, 0x41, 0x07, 0x8d, 0xa0, 0xb4, 0x7d, 0x7c, 0xb8, 0xb7, 0x53, 0xaf, 0xb5, 0x1a,
- 0xca, 0xc9, 0x41, 0xab, 0x21, 0x0a, 0xe8, 0x1a, 0x2c, 0xef, 0xed, 0xfc, 0x75, 0xb3, 0xa5, 0xd4,
- 0xf7, 0x76, 0x1a, 0xfb, 0x2d, 0xa5, 0xd6, 0x6a, 0xd5, 0xea, 0x8f, 0xc5, 0xf8, 0xfd, 0xff, 0x05,
- 0x28, 0xd7, 0xb6, 0xea, 0x3b, 0x35, 0xc3, 0xe8, 0x69, 0x6d, 0x95, 0xba, 0xfb, 0x3a, 0x24, 0x29,
- 0xb2, 0x3c, 0xf5, 0x89, 0x6f, 0x75, 0x7a, 0x5d, 0x0c, 0x3d, 0x82, 0x14, 0x05, 0x9d, 0xd1, 0xf4,
- 0x37, 0xbf, 0xd5, 0x19, 0x85, 0x32, 0x32, 0x18, 0x7a, 0x6e, 0xa6, 0x3e, 0x02, 0xae, 0x4e, 0xaf,
- 0x9b, 0xa1, 0x3d, 0xc8, 0x38, 0x80, 0xdb, 0xac, 0x97, 0xb9, 0xd5, 0x99, 0xc5, 0x2c, 0x32, 0x35,
- 0x06, 0x5c, 0x4e, 0x7f, 0x1f, 0x5c, 0x9d, 0x51, 0x51, 0x43, 0x32, 0xe4, 0x3c, 0x28, 0x7b, 0xf6,
- 0x53, 0xe5, 0xea, 0x1c, 0x15, 0x3e, 0xf4, 0x05, 0x14, 0x83, 0xd0, 0xdc, 0x7c, 0xaf, 0x88, 0xab,
- 0x73, 0x56, 0xdf, 0x88, 0xfe, 0x20, 0x4e, 0x37, 0xdf, 0xab, 0xe2, 0xea, 0x9c, 0xc5, 0x38, 0xf4,
- 0x25, 0x2c, 0x8d, 0xe3, 0x68, 0xf3, 0x3f, 0x32, 0xae, 0x2e, 0x50, 0x9e, 0x43, 0x7d, 0x40, 0x13,
- 0xf0, 0xb7, 0x05, 0xde, 0x1c, 0x57, 0x17, 0xa9, 0xd6, 0xa1, 0x0e, 0x94, 0xc3, 0xd8, 0xd4, 0xbc,
- 0x6f, 0x90, 0xab, 0x73, 0x57, 0xee, 0xd8, 0x57, 0x82, 0x18, 0xc9, 0xbc, 0x6f, 0x92, 0xab, 0x73,
- 0x17, 0xf2, 0xd0, 0x31, 0x80, 0xef, 0x6e, 0x3b, 0xc7, 0x1b, 0xe5, 0xea, 0x3c, 0x25, 0x3d, 0x64,
- 0xc0, 0xf2, 0xa4, 0xcb, 0xec, 0x22, 0x4f, 0x96, 0xab, 0x0b, 0x55, 0xfa, 0x88, 0x3d, 0x07, 0xef,
- 0xa5, 0xf3, 0x3d, 0x61, 0xae, 0xce, 0x59, 0xf2, 0xdb, 0xda, 0xfa, 0xe1, 0xc5, 0xaa, 0xf0, 0xe3,
- 0x8b, 0x55, 0xe1, 0xa7, 0x17, 0xab, 0xc2, 0x77, 0x3f, 0xaf, 0xc6, 0x7e, 0xfc, 0x79, 0x35, 0xf6,
- 0xdf, 0x3f, 0xaf, 0xc6, 0xfe, 0xe6, 0xee, 0xb9, 0x66, 0x77, 0x87, 0xa7, 0x1b, 0x6d, 0xbd, 0x4f,
- 0xff, 0x41, 0x62, 0xa8, 0x97, 0x9b, 0x4c, 0x27, 0x69, 0xf9, 0xfe, 0xa7, 0x72, 0x9a, 0xa6, 0xb1,
- 0xee, 0xc1, 0x1f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x0d, 0x71, 0x2a, 0xdd, 0xc7, 0x32, 0x00, 0x00,
+ // 3807 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0xcb, 0x6f, 0x1b, 0x57,
+ 0x77, 0xe7, 0xf0, 0xcd, 0xc3, 0xd7, 0xe8, 0x4a, 0xb6, 0x69, 0xda, 0x96, 0xf4, 0x8d, 0x9b, 0xd8,
+ 0x71, 0x12, 0xc9, 0xb1, 0x9b, 0x38, 0x69, 0x92, 0x02, 0x14, 0x45, 0x97, 0x92, 0x65, 0x49, 0x19,
+ 0x51, 0x0a, 0xd2, 0x34, 0x19, 0x8c, 0xc8, 0x2b, 0x71, 0x62, 0x92, 0x33, 0x99, 0x19, 0xca, 0x54,
+ 0xb6, 0x6d, 0x81, 0x22, 0x8b, 0x22, 0xff, 0x40, 0x76, 0x2d, 0xd0, 0x4d, 0xf7, 0x5d, 0xb5, 0xcb,
+ 0xa6, 0xe8, 0x26, 0xcb, 0x02, 0x45, 0xdd, 0xc0, 0xd9, 0xb5, 0xab, 0xac, 0xba, 0xe9, 0xa2, 0xb8,
+ 0x8f, 0x79, 0x91, 0x33, 0x7c, 0xc4, 0x01, 0x8a, 0x6f, 0xc7, 0x7b, 0xee, 0x39, 0xe7, 0xbe, 0xce,
+ 0x3d, 0xe7, 0xdc, 0xdf, 0x19, 0xc2, 0x0d, 0x1b, 0x0f, 0x3a, 0xd8, 0xec, 0x6b, 0x03, 0x7b, 0x53,
+ 0x3d, 0x6d, 0x6b, 0x9b, 0xf6, 0xa5, 0x81, 0xad, 0x0d, 0xc3, 0xd4, 0x6d, 0x1d, 0x95, 0xbd, 0xce,
+ 0x0d, 0xd2, 0x59, 0xbd, 0xe5, 0xe3, 0x6e, 0x9b, 0x97, 0x86, 0xad, 0x6f, 0x1a, 0xa6, 0xae, 0x9f,
+ 0x31, 0xfe, 0xaa, 0x5f, 0x19, 0xd5, 0xb3, 0xd9, 0x51, 0xad, 0x2e, 0xef, 0xbc, 0x39, 0xd1, 0x79,
+ 0xda, 0xd3, 0xdb, 0xcf, 0x22, 0x7b, 0x7d, 0x13, 0x09, 0xf4, 0xf2, 0x71, 0x9f, 0xe1, 0x4b, 0xa7,
+ 0xf7, 0xd6, 0x84, 0xac, 0xa1, 0x9a, 0x6a, 0xdf, 0xe9, 0x5e, 0xf5, 0x75, 0x5f, 0x60, 0xd3, 0xd2,
+ 0xf4, 0x41, 0x40, 0xf9, 0xda, 0xb9, 0xae, 0x9f, 0xf7, 0xf0, 0x26, 0x6d, 0x9d, 0x0e, 0xcf, 0x36,
+ 0x6d, 0xad, 0x8f, 0x2d, 0x5b, 0xed, 0x1b, 0x9c, 0x61, 0xe5, 0x5c, 0x3f, 0xd7, 0xe9, 0xcf, 0x4d,
+ 0xf2, 0x8b, 0x51, 0xa5, 0xff, 0xce, 0x41, 0x46, 0xc6, 0x5f, 0x0f, 0xb1, 0x65, 0xa3, 0x07, 0x90,
+ 0xc4, 0xed, 0xae, 0x5e, 0x11, 0xd6, 0x85, 0xbb, 0xf9, 0x07, 0x37, 0x37, 0xc6, 0xf6, 0x6d, 0x83,
+ 0xf3, 0x35, 0xda, 0x5d, 0xbd, 0x19, 0x93, 0x29, 0x2f, 0x7a, 0x17, 0x52, 0x67, 0xbd, 0xa1, 0xd5,
+ 0xad, 0xc4, 0xa9, 0xd0, 0xad, 0x28, 0xa1, 0xc7, 0x84, 0xa9, 0x19, 0x93, 0x19, 0x37, 0x19, 0x4a,
+ 0x1b, 0x9c, 0xe9, 0x95, 0xc4, 0xf4, 0xa1, 0x76, 0x06, 0x67, 0x74, 0x28, 0xc2, 0x8b, 0xb6, 0x00,
+ 0xb4, 0x81, 0x66, 0x2b, 0xed, 0xae, 0xaa, 0x0d, 0x2a, 0x49, 0x2a, 0xf9, 0xbb, 0x68, 0x49, 0xcd,
+ 0xae, 0x13, 0xc6, 0x66, 0x4c, 0xce, 0x69, 0x4e, 0x83, 0x4c, 0xf7, 0xeb, 0x21, 0x36, 0x2f, 0x2b,
+ 0xa9, 0xe9, 0xd3, 0xfd, 0x84, 0x30, 0x91, 0xe9, 0x52, 0x6e, 0xf4, 0x11, 0x64, 0xdb, 0x5d, 0xdc,
+ 0x7e, 0xa6, 0xd8, 0xa3, 0x4a, 0x86, 0x4a, 0xae, 0x45, 0x49, 0xd6, 0x09, 0x5f, 0x6b, 0xd4, 0x8c,
+ 0xc9, 0x99, 0x36, 0xfb, 0x89, 0xf6, 0xa1, 0xd4, 0xd3, 0x2c, 0x5b, 0xb1, 0x06, 0xaa, 0x61, 0x75,
+ 0x75, 0xdb, 0xaa, 0xe4, 0xa9, 0x8e, 0xd7, 0xa2, 0x74, 0xec, 0x69, 0x96, 0x7d, 0xe4, 0x30, 0x37,
+ 0x63, 0x72, 0xb1, 0xe7, 0x27, 0x10, 0x7d, 0xfa, 0xd9, 0x19, 0x36, 0x5d, 0x85, 0x95, 0xc2, 0x74,
+ 0x7d, 0x07, 0x84, 0xdb, 0x91, 0x27, 0xfa, 0x74, 0x3f, 0x01, 0x7d, 0x0e, 0xcb, 0x3d, 0x5d, 0xed,
+ 0xb8, 0xea, 0x94, 0x76, 0x77, 0x38, 0x78, 0x56, 0x29, 0x52, 0xa5, 0x6f, 0x44, 0x4e, 0x52, 0x57,
+ 0x3b, 0x8e, 0x8a, 0x3a, 0x11, 0x68, 0xc6, 0xe4, 0xa5, 0xde, 0x38, 0x11, 0x7d, 0x09, 0x2b, 0xaa,
+ 0x61, 0xf4, 0x2e, 0xc7, 0xb5, 0x97, 0xa8, 0xf6, 0x7b, 0x51, 0xda, 0x6b, 0x44, 0x66, 0x5c, 0x3d,
+ 0x52, 0x27, 0xa8, 0xa8, 0x03, 0x57, 0xcf, 0xb4, 0x81, 0xda, 0xd3, 0xbe, 0xc1, 0xde, 0x10, 0xd6,
+ 0xe5, 0xa0, 0x5d, 0x59, 0xa1, 0x23, 0xbc, 0x15, 0x69, 0x91, 0x5c, 0xca, 0x51, 0x77, 0x74, 0x39,
+ 0x68, 0x37, 0x63, 0xf2, 0xca, 0x59, 0x08, 0x1d, 0xb5, 0x40, 0x34, 0x4c, 0x6c, 0xa8, 0x26, 0x56,
+ 0x0c, 0x53, 0x37, 0x74, 0x4b, 0xed, 0x55, 0xca, 0x54, 0xff, 0x9d, 0x28, 0xfd, 0x87, 0x8c, 0xff,
+ 0x90, 0xb3, 0x37, 0x63, 0x72, 0xd9, 0x08, 0x92, 0x98, 0x56, 0xbd, 0x8d, 0x2d, 0xcb, 0xd3, 0x2a,
+ 0xce, 0xd2, 0x4a, 0xf9, 0x83, 0x5a, 0x03, 0x24, 0xd4, 0x80, 0x3c, 0x1e, 0x11, 0x71, 0xe5, 0x42,
+ 0xb7, 0x71, 0x65, 0x89, 0x2a, 0x94, 0x22, 0x6f, 0x33, 0x65, 0x3d, 0xd1, 0x6d, 0xdc, 0x8c, 0xc9,
+ 0x80, 0xdd, 0x16, 0x52, 0xe1, 0xca, 0x05, 0x36, 0xb5, 0xb3, 0x4b, 0xaa, 0x46, 0xa1, 0x3d, 0xc4,
+ 0xeb, 0x54, 0x10, 0x55, 0xf8, 0x66, 0x94, 0xc2, 0x13, 0x2a, 0x44, 0x54, 0x34, 0x1c, 0x91, 0x66,
+ 0x4c, 0x5e, 0xbe, 0x98, 0x24, 0x13, 0x43, 0x76, 0xcf, 0x8e, 0xba, 0xd1, 0xca, 0xf2, 0x74, 0x43,
+ 0x76, 0xce, 0x6c, 0x8b, 0x30, 0x13, 0x43, 0x3e, 0xf3, 0x13, 0xb6, 0x32, 0x90, 0xba, 0x50, 0x7b,
+ 0x43, 0xbc, 0x9b, 0xcc, 0xa6, 0xc5, 0xcc, 0x6e, 0x32, 0x9b, 0x15, 0x73, 0xbb, 0xc9, 0x6c, 0x4e,
+ 0x84, 0xdd, 0x64, 0x16, 0xc4, 0xbc, 0x74, 0x07, 0xf2, 0x3e, 0x27, 0x86, 0x2a, 0x90, 0xe9, 0x63,
+ 0xcb, 0x52, 0xcf, 0x31, 0xf5, 0x79, 0x39, 0xd9, 0x69, 0x4a, 0x25, 0x28, 0xf8, 0x1d, 0x97, 0xf4,
+ 0x9d, 0xe0, 0x4a, 0x12, 0x9f, 0x44, 0x24, 0xb9, 0x13, 0x76, 0x24, 0x79, 0x13, 0xdd, 0x86, 0x22,
+ 0x5d, 0x8a, 0xe2, 0xf4, 0x13, 0xc7, 0x98, 0x94, 0x0b, 0x94, 0x78, 0xc2, 0x99, 0xd6, 0x20, 0x6f,
+ 0x3c, 0x30, 0x5c, 0x96, 0x04, 0x65, 0x01, 0xe3, 0x81, 0xe1, 0x30, 0xfc, 0x0e, 0x0a, 0x64, 0xdd,
+ 0x2e, 0x47, 0x92, 0x0e, 0x92, 0x27, 0x34, 0xce, 0x22, 0xfd, 0x45, 0x02, 0xc4, 0x71, 0x67, 0x87,
+ 0xde, 0x87, 0x24, 0xf1, 0xfb, 0xdc, 0x85, 0x57, 0x37, 0x58, 0x50, 0xd8, 0x70, 0x82, 0xc2, 0x46,
+ 0xcb, 0x09, 0x0a, 0x5b, 0xd9, 0x1f, 0x5e, 0xac, 0xc5, 0xbe, 0xfb, 0xcf, 0x35, 0x41, 0xa6, 0x12,
+ 0xe8, 0x3a, 0x71, 0x71, 0xaa, 0x36, 0x50, 0xb4, 0x0e, 0x9d, 0x72, 0x8e, 0xf8, 0x2f, 0x55, 0x1b,
+ 0xec, 0x74, 0xd0, 0x1e, 0x88, 0x6d, 0x7d, 0x60, 0xe1, 0x81, 0x35, 0xb4, 0x14, 0x16, 0x94, 0xb8,
+ 0xe3, 0x0e, 0xb8, 0x5f, 0x16, 0x8d, 0xea, 0x0e, 0xe7, 0x21, 0x65, 0x94, 0xcb, 0xed, 0x20, 0x01,
+ 0xed, 0x43, 0xf1, 0x42, 0xed, 0x69, 0x1d, 0xd5, 0xd6, 0x4d, 0xc5, 0xc2, 0x36, 0xf7, 0xe4, 0xb7,
+ 0x27, 0xce, 0xfc, 0xc4, 0xe1, 0x3a, 0xc2, 0xf6, 0xb1, 0xd1, 0x51, 0x6d, 0xbc, 0x95, 0xfc, 0xe1,
+ 0xc5, 0x9a, 0x20, 0x17, 0x2e, 0x7c, 0x3d, 0xe8, 0x75, 0x28, 0xab, 0x86, 0xa1, 0x58, 0xb6, 0x6a,
+ 0x63, 0xe5, 0xf4, 0xd2, 0xc6, 0x16, 0x75, 0xee, 0x05, 0xb9, 0xa8, 0x1a, 0xc6, 0x11, 0xa1, 0x6e,
+ 0x11, 0x22, 0x7a, 0x0d, 0x4a, 0x24, 0x0e, 0x68, 0x6a, 0x4f, 0xe9, 0x62, 0xed, 0xbc, 0x6b, 0x57,
+ 0xd2, 0xeb, 0xc2, 0xdd, 0x84, 0x5c, 0xe4, 0xd4, 0x26, 0x25, 0xa2, 0x0d, 0x58, 0x76, 0xd8, 0xda,
+ 0xba, 0x89, 0x1d, 0x5e, 0xe2, 0xf5, 0x8b, 0xf2, 0x12, 0xef, 0xaa, 0xeb, 0x26, 0x66, 0xfc, 0x52,
+ 0xc7, 0xb5, 0x14, 0x1a, 0x33, 0x10, 0x82, 0x64, 0x47, 0xb5, 0x55, 0x7a, 0x02, 0x05, 0x99, 0xfe,
+ 0x26, 0x34, 0x43, 0xb5, 0xbb, 0x7c, 0x5f, 0xe9, 0x6f, 0x74, 0x15, 0xd2, 0x5c, 0x75, 0x82, 0x4e,
+ 0x83, 0xb7, 0xd0, 0x0a, 0xa4, 0x0c, 0x53, 0xbf, 0xc0, 0x74, 0x5b, 0xb2, 0x32, 0x6b, 0x48, 0x32,
+ 0x94, 0x82, 0xf1, 0x05, 0x95, 0x20, 0x6e, 0x8f, 0xf8, 0x28, 0x71, 0x7b, 0x84, 0xee, 0x43, 0x92,
+ 0x1c, 0x00, 0x1d, 0xa3, 0x14, 0x12, 0x51, 0xb9, 0x5c, 0xeb, 0xd2, 0xc0, 0x32, 0xe5, 0x94, 0xae,
+ 0xc2, 0x4a, 0x58, 0xbc, 0x91, 0xba, 0x2e, 0x3d, 0x10, 0x37, 0xd0, 0xbb, 0x90, 0x75, 0x03, 0x0e,
+ 0xb3, 0xaf, 0xeb, 0x13, 0xa3, 0x38, 0xcc, 0xb2, 0xcb, 0x4a, 0x0c, 0x8b, 0x9c, 0x4f, 0x57, 0xe5,
+ 0x49, 0x42, 0x41, 0xce, 0xa8, 0x86, 0xd1, 0x54, 0xad, 0xae, 0x74, 0x0e, 0x95, 0xa8, 0x60, 0xe2,
+ 0xdb, 0x1f, 0x81, 0xde, 0x0e, 0x67, 0x7f, 0x7c, 0x37, 0x2f, 0x4e, 0xcf, 0xc4, 0xbd, 0x79, 0xd4,
+ 0x82, 0x87, 0x83, 0x67, 0xc4, 0x82, 0x13, 0x6c, 0x20, 0xda, 0xde, 0xe9, 0x48, 0x1d, 0xb8, 0x1e,
+ 0x19, 0x57, 0x02, 0x72, 0x42, 0x40, 0x8e, 0x1c, 0x06, 0x8b, 0x56, 0x6c, 0xe2, 0xac, 0x41, 0xa6,
+ 0x66, 0xd1, 0x75, 0xd3, 0x61, 0x72, 0x32, 0x6f, 0x49, 0x7f, 0x2d, 0xc0, 0x8d, 0x29, 0xc1, 0x05,
+ 0x7d, 0x0c, 0xf9, 0x1e, 0x59, 0x03, 0xf7, 0x75, 0x21, 0x69, 0x16, 0xbb, 0x42, 0x7b, 0x84, 0x89,
+ 0x7a, 0x34, 0x19, 0x7a, 0xee, 0x6f, 0x74, 0x1f, 0xd2, 0x6d, 0xbd, 0xdf, 0xd7, 0x6c, 0x9e, 0x6b,
+ 0x55, 0xc2, 0x2e, 0x1f, 0xe9, 0x97, 0x39, 0x9f, 0xf4, 0x4b, 0x12, 0xae, 0x86, 0x47, 0x23, 0xb4,
+ 0x0e, 0x85, 0xbe, 0x3a, 0x52, 0xec, 0x11, 0xbf, 0x32, 0x02, 0x35, 0x42, 0xe8, 0xab, 0xa3, 0xd6,
+ 0x88, 0xdd, 0x17, 0x11, 0x12, 0xf6, 0xc8, 0xaa, 0xc4, 0xd7, 0x13, 0x77, 0x0b, 0x32, 0xf9, 0x89,
+ 0x9e, 0xc2, 0x52, 0x4f, 0x6f, 0xab, 0x3d, 0xa5, 0xa7, 0x5a, 0xb6, 0xc2, 0xe7, 0xc2, 0x1c, 0xc1,
+ 0x8d, 0x49, 0x7b, 0xa3, 0xdd, 0xc4, 0x59, 0xd2, 0x5b, 0x1b, 0x93, 0xcb, 0x54, 0x76, 0x4f, 0xb5,
+ 0x6c, 0xd6, 0x85, 0xb6, 0x21, 0xdf, 0xd7, 0xac, 0x53, 0xdc, 0x55, 0x2f, 0x34, 0xdd, 0xac, 0x24,
+ 0xd7, 0x13, 0xa1, 0xa9, 0xe0, 0x53, 0x8f, 0x87, 0x6b, 0xf2, 0x8b, 0xf9, 0xec, 0x24, 0x15, 0xb8,
+ 0x47, 0x8e, 0x27, 0x4c, 0x2f, 0xec, 0x09, 0xef, 0xc3, 0xca, 0x00, 0x8f, 0x6c, 0xc5, 0xf5, 0x32,
+ 0x16, 0x33, 0xde, 0x0c, 0xb5, 0x01, 0x44, 0xfa, 0x5c, 0xd7, 0x64, 0x11, 0x3b, 0x26, 0x66, 0x62,
+ 0xea, 0xc3, 0x41, 0xa7, 0x92, 0x5d, 0x17, 0xee, 0xa6, 0x64, 0xd6, 0x40, 0x8f, 0xa0, 0x42, 0x3d,
+ 0x08, 0x73, 0xab, 0xe4, 0x08, 0x71, 0xc7, 0x71, 0x27, 0x39, 0x6a, 0xba, 0x57, 0x48, 0x3f, 0x75,
+ 0xdc, 0x7b, 0xb4, 0x97, 0xbb, 0xa0, 0x4d, 0x58, 0x61, 0xe9, 0x00, 0x36, 0x49, 0x5e, 0x40, 0x0e,
+ 0x89, 0x4e, 0x00, 0xe8, 0x04, 0x96, 0x9c, 0xbe, 0x43, 0x53, 0x6f, 0x8d, 0xe8, 0xf8, 0xf7, 0x5d,
+ 0x81, 0x8e, 0x42, 0xee, 0x9a, 0x73, 0x41, 0xf2, 0xf4, 0xe6, 0x20, 0xa7, 0xaf, 0x66, 0xb8, 0xf1,
+ 0xe5, 0x91, 0x77, 0x8b, 0x0a, 0x93, 0x99, 0x30, 0xef, 0xf2, 0x7c, 0xb9, 0x77, 0xc9, 0xd6, 0x20,
+ 0xff, 0xf5, 0x50, 0x37, 0x87, 0x7d, 0x36, 0xa5, 0x22, 0x9d, 0x12, 0x30, 0x12, 0xbd, 0xd3, 0xff,
+ 0x94, 0xf2, 0xd9, 0x5c, 0x30, 0x31, 0xe1, 0x16, 0x25, 0x78, 0x16, 0x75, 0xe4, 0x9b, 0xb8, 0xdf,
+ 0xa8, 0xe2, 0xf3, 0x1a, 0x95, 0xbb, 0xb6, 0x68, 0xbb, 0x4a, 0xfc, 0x3a, 0xbb, 0x42, 0x90, 0xa4,
+ 0x2b, 0x4c, 0x32, 0x3f, 0x4e, 0x7e, 0x47, 0xda, 0x9a, 0x7b, 0xfe, 0x69, 0xff, 0xf9, 0x3b, 0x16,
+ 0x98, 0xf9, 0xcd, 0x2c, 0x30, 0x1b, 0x69, 0x81, 0xbf, 0xda, 0xd6, 0x5a, 0x70, 0x75, 0x4c, 0x50,
+ 0x19, 0xd2, 0x58, 0x4b, 0xad, 0x6d, 0xec, 0x9d, 0xe3, 0x38, 0x19, 0x9f, 0x22, 0x79, 0x39, 0xa0,
+ 0x97, 0xc5, 0xe9, 0x48, 0x0b, 0xce, 0x2f, 0x6a, 0xc1, 0x85, 0x79, 0x2c, 0xb8, 0xf8, 0x2a, 0x16,
+ 0x5c, 0x9a, 0xb0, 0xe0, 0x63, 0x58, 0x9a, 0xc8, 0x8d, 0x5d, 0x73, 0x10, 0x42, 0xcd, 0x21, 0x1e,
+ 0x6e, 0x0e, 0x09, 0x9f, 0x39, 0x48, 0x3f, 0x09, 0x50, 0x8d, 0x4e, 0x91, 0x43, 0x07, 0x78, 0x07,
+ 0xae, 0x78, 0xa9, 0x92, 0x7f, 0x1f, 0x59, 0x38, 0x42, 0x6e, 0xa7, 0xb7, 0x91, 0x53, 0xd2, 0x0a,
+ 0x36, 0xa7, 0xa4, 0xdf, 0x44, 0x9f, 0x42, 0x39, 0x98, 0xdc, 0x93, 0xdc, 0x89, 0x5c, 0x97, 0x3f,
+ 0x98, 0xb8, 0x2e, 0xde, 0x5e, 0xb8, 0x73, 0x96, 0x4b, 0x17, 0xfe, 0xa6, 0x25, 0xfd, 0x6b, 0xdc,
+ 0x4d, 0x1d, 0x02, 0x99, 0x3a, 0xfa, 0xc0, 0x0d, 0x5d, 0xc2, 0xbc, 0x37, 0x9b, 0x0b, 0x8c, 0xdf,
+ 0xe6, 0xf8, 0xab, 0xdd, 0xe6, 0x44, 0xe8, 0xf1, 0x25, 0xc3, 0xb7, 0x2a, 0xe5, 0xdf, 0xaa, 0xb7,
+ 0x21, 0xc5, 0xc2, 0x36, 0x0b, 0x28, 0xd7, 0x26, 0xef, 0x05, 0x8b, 0xd8, 0x8c, 0x0b, 0xd5, 0x20,
+ 0xcb, 0x9e, 0x01, 0x5a, 0x87, 0x3b, 0x80, 0xeb, 0x11, 0x12, 0x3b, 0xdb, 0x5b, 0xf9, 0x97, 0x2f,
+ 0xd6, 0x32, 0xbc, 0x21, 0x67, 0xa8, 0xdc, 0x4e, 0x47, 0xfa, 0x3b, 0x80, 0xac, 0x8c, 0x2d, 0x83,
+ 0x98, 0x30, 0xda, 0x82, 0x1c, 0x1e, 0xb5, 0xb1, 0x61, 0x3b, 0x4f, 0x8e, 0xf0, 0x27, 0x1d, 0xe3,
+ 0x6e, 0x38, 0x9c, 0xcd, 0x98, 0xec, 0x89, 0xa1, 0x87, 0x1c, 0xdf, 0x89, 0x86, 0x6a, 0xb8, 0xb8,
+ 0x1f, 0xe0, 0x79, 0xcf, 0x01, 0x78, 0x58, 0xa0, 0x5f, 0x8d, 0x94, 0x1a, 0x43, 0x78, 0x1e, 0x72,
+ 0x84, 0x27, 0x39, 0x63, 0xb0, 0x00, 0xc4, 0x53, 0x0f, 0x40, 0x3c, 0xa9, 0x19, 0xcb, 0x8c, 0xc0,
+ 0x78, 0xde, 0x73, 0x30, 0x9e, 0xf4, 0x8c, 0x19, 0x8f, 0x81, 0x3c, 0x1f, 0x4f, 0x80, 0x3c, 0xeb,
+ 0x91, 0xa2, 0x21, 0x28, 0xcf, 0xc1, 0x04, 0xca, 0x93, 0xa5, 0x4a, 0x5e, 0x8f, 0x54, 0x32, 0x03,
+ 0xe6, 0x39, 0x98, 0x80, 0x79, 0x72, 0x33, 0x14, 0xce, 0xc0, 0x79, 0xfe, 0x2c, 0x1c, 0xe7, 0x81,
+ 0x48, 0x24, 0x86, 0x4f, 0x73, 0x3e, 0xa0, 0x47, 0x89, 0x00, 0x7a, 0xf2, 0x91, 0x70, 0x01, 0x53,
+ 0x3f, 0x37, 0xd2, 0x83, 0x23, 0x91, 0x1e, 0x06, 0x71, 0xbc, 0x1d, 0x6d, 0x9a, 0x8b, 0x40, 0x3d,
+ 0xc7, 0x21, 0x50, 0x0f, 0xcb, 0x91, 0xee, 0x46, 0x0e, 0x30, 0x07, 0xd6, 0x73, 0x1c, 0x82, 0xf5,
+ 0x14, 0x67, 0xaa, 0x9d, 0x09, 0xf6, 0x3c, 0x0e, 0x82, 0x3d, 0xa5, 0x88, 0xb7, 0xb4, 0xe7, 0x19,
+ 0x22, 0xd0, 0x9e, 0xd3, 0x28, 0xb4, 0xa7, 0x1c, 0x89, 0xa2, 0x31, 0x8d, 0x0b, 0xc0, 0x3d, 0x07,
+ 0x13, 0x70, 0x8f, 0x38, 0xc3, 0xa0, 0xe7, 0xc4, 0x7b, 0xa4, 0x37, 0x48, 0xc8, 0x1e, 0xf3, 0x7d,
+ 0xc4, 0x8f, 0x63, 0xd3, 0xd4, 0x4d, 0x8e, 0xd0, 0xb0, 0x86, 0x74, 0x97, 0xbc, 0xd7, 0x3d, 0x3f,
+ 0x37, 0x05, 0x03, 0x2a, 0x43, 0x31, 0xe0, 0xdb, 0xa4, 0x7f, 0x10, 0x3c, 0x59, 0x8a, 0x02, 0xf9,
+ 0xdf, 0xfa, 0x39, 0xfe, 0xd6, 0x1f, 0x7b, 0x9f, 0xe6, 0x02, 0x89, 0x87, 0x3f, 0xb5, 0xe1, 0xa0,
+ 0x8f, 0xea, 0xa5, 0x34, 0xf7, 0x60, 0x89, 0x26, 0xc1, 0x2c, 0x70, 0x04, 0x62, 0x53, 0x99, 0x74,
+ 0xb0, 0x5d, 0x60, 0x41, 0xea, 0x6d, 0x58, 0xf6, 0xf1, 0xba, 0x0f, 0x6c, 0x86, 0x7c, 0x88, 0x2e,
+ 0x77, 0x8d, 0xbf, 0xb4, 0xff, 0x39, 0xe1, 0xed, 0x90, 0x87, 0x16, 0x85, 0x01, 0x3b, 0xc2, 0xaf,
+ 0x06, 0x76, 0xa2, 0x1f, 0xfa, 0xe8, 0x73, 0x58, 0x09, 0x60, 0x3e, 0x4e, 0x8e, 0x99, 0x58, 0x0c,
+ 0xfa, 0x89, 0xf9, 0x52, 0x1e, 0xb7, 0x07, 0x7d, 0x01, 0x37, 0x68, 0xb6, 0x1c, 0x91, 0xc7, 0x26,
+ 0xe7, 0xcb, 0x63, 0xaf, 0x11, 0x1d, 0xf5, 0x90, 0x5c, 0x36, 0x02, 0x10, 0x4a, 0x45, 0x00, 0x42,
+ 0x68, 0x0f, 0x0a, 0xe7, 0x78, 0x80, 0x2d, 0xcd, 0x52, 0x16, 0x78, 0x80, 0x0a, 0x24, 0xfd, 0x6f,
+ 0xc6, 0xe4, 0x3c, 0x97, 0x25, 0xbd, 0x7f, 0x25, 0x08, 0x5b, 0x65, 0x28, 0x2a, 0x7e, 0x75, 0xd2,
+ 0xff, 0x08, 0x9e, 0x59, 0xba, 0x88, 0x53, 0x5b, 0xef, 0x30, 0xf3, 0x2d, 0xca, 0xf4, 0x37, 0x79,
+ 0x6a, 0xf5, 0xf4, 0x73, 0x6e, 0x81, 0xe4, 0x27, 0xe1, 0x72, 0x2b, 0x2e, 0x39, 0x1e, 0x6e, 0x57,
+ 0x20, 0xa5, 0x0d, 0x3a, 0x78, 0xc4, 0x8d, 0x8c, 0x35, 0x88, 0xec, 0x33, 0x7c, 0xc9, 0x4d, 0x89,
+ 0xfc, 0x24, 0x7c, 0xf4, 0x9e, 0xd1, 0xb5, 0x14, 0x64, 0xd6, 0x40, 0xef, 0x43, 0x8e, 0x96, 0xcd,
+ 0x14, 0xdd, 0xb0, 0x78, 0xc0, 0x0c, 0xe4, 0x75, 0xac, 0xc4, 0xb5, 0x71, 0x48, 0x78, 0x0e, 0x0c,
+ 0x4b, 0xce, 0x1a, 0xfc, 0x97, 0x2f, 0xf3, 0xca, 0x06, 0x32, 0xaf, 0x9b, 0x90, 0x23, 0xb3, 0xb7,
+ 0x0c, 0xb5, 0x8d, 0x69, 0xb0, 0xcb, 0xc9, 0x1e, 0x41, 0xfa, 0x47, 0x01, 0xca, 0x63, 0xf1, 0x37,
+ 0x74, 0xed, 0xce, 0xad, 0x8c, 0x07, 0x11, 0xb8, 0x89, 0xd5, 0xdf, 0x02, 0x38, 0x57, 0x2d, 0xe5,
+ 0xb9, 0x3a, 0xb0, 0x71, 0x87, 0x6f, 0x41, 0xee, 0x5c, 0xb5, 0x3e, 0xa5, 0x84, 0xe0, 0x64, 0x52,
+ 0x63, 0x93, 0xf1, 0x61, 0x40, 0x69, 0x3f, 0x06, 0x84, 0xaa, 0x90, 0x35, 0x4c, 0x4d, 0x37, 0x35,
+ 0xfb, 0x92, 0xee, 0x49, 0x42, 0x76, 0xdb, 0xd2, 0x21, 0x5c, 0x09, 0x0d, 0xfd, 0xe8, 0x11, 0xe4,
+ 0xbc, 0xac, 0x41, 0xa0, 0x19, 0xee, 0x14, 0x68, 0xcd, 0xe3, 0x25, 0x5b, 0x72, 0x25, 0x34, 0xf8,
+ 0xa3, 0x06, 0xa4, 0x4d, 0x6c, 0x0d, 0x7b, 0x2c, 0xe3, 0x2e, 0x4d, 0x09, 0x8e, 0x01, 0x39, 0x42,
+ 0x1d, 0xf6, 0x6c, 0x99, 0x0b, 0x4b, 0x5f, 0x42, 0x9a, 0x51, 0x50, 0x1e, 0x32, 0xc7, 0xfb, 0x4f,
+ 0xf6, 0x0f, 0x3e, 0xdd, 0x17, 0x63, 0x08, 0x20, 0x5d, 0xab, 0xd7, 0x1b, 0x87, 0x2d, 0x51, 0x40,
+ 0x39, 0x48, 0xd5, 0xb6, 0x0e, 0xe4, 0x96, 0x18, 0x27, 0x64, 0xb9, 0xb1, 0xdb, 0xa8, 0xb7, 0xc4,
+ 0x04, 0x5a, 0x82, 0x22, 0xfb, 0xad, 0x3c, 0x3e, 0x90, 0x9f, 0xd6, 0x5a, 0x62, 0xd2, 0x47, 0x3a,
+ 0x6a, 0xec, 0x6f, 0x37, 0x64, 0x31, 0x25, 0xbd, 0x03, 0xd7, 0x23, 0xd3, 0x0c, 0x0f, 0x7d, 0x13,
+ 0x7c, 0xe8, 0x9b, 0xf4, 0x63, 0x9c, 0xbc, 0xa3, 0xa2, 0x72, 0x07, 0xb4, 0x3b, 0xb6, 0xf0, 0x07,
+ 0x0b, 0x24, 0x1e, 0x63, 0xab, 0x47, 0xaf, 0x41, 0xc9, 0xc4, 0x67, 0xd8, 0x6e, 0x77, 0x59, 0x2e,
+ 0xe3, 0xa0, 0x61, 0x45, 0x4e, 0xa5, 0x42, 0x16, 0x63, 0xfb, 0x0a, 0xb7, 0x6d, 0x85, 0x19, 0x81,
+ 0x45, 0x31, 0x87, 0x1c, 0x61, 0x23, 0xd4, 0x23, 0x46, 0x24, 0xfe, 0x9f, 0xf9, 0x29, 0xa6, 0x2a,
+ 0x49, 0x55, 0x01, 0x75, 0x3b, 0x94, 0x22, 0x3d, 0x5f, 0x68, 0xb3, 0x73, 0x90, 0x92, 0x1b, 0x2d,
+ 0xf9, 0x33, 0x31, 0x81, 0x10, 0x94, 0xe8, 0x4f, 0xe5, 0x68, 0xbf, 0x76, 0x78, 0xd4, 0x3c, 0x20,
+ 0x9b, 0xbd, 0x0c, 0x65, 0x67, 0xb3, 0x1d, 0x62, 0x0a, 0x5d, 0x81, 0xa5, 0xfa, 0xc1, 0xd3, 0xc3,
+ 0xbd, 0x46, 0xab, 0xe1, 0x91, 0xd3, 0xd2, 0x2a, 0xdc, 0x9c, 0x96, 0x2a, 0x49, 0xff, 0x9e, 0x80,
+ 0x6b, 0x11, 0xa9, 0x0e, 0x7a, 0x1f, 0xc0, 0x1e, 0x29, 0x26, 0x6e, 0xeb, 0x66, 0x27, 0xda, 0x78,
+ 0x5b, 0x23, 0x99, 0x72, 0xc8, 0x39, 0x9b, 0xff, 0x9a, 0x1a, 0x2f, 0x3e, 0xe2, 0x4a, 0xc9, 0x66,
+ 0x58, 0x1c, 0xc1, 0xb9, 0x15, 0xf2, 0x24, 0xc5, 0x6d, 0xa2, 0x98, 0x9e, 0x19, 0x55, 0x4c, 0xf9,
+ 0xd1, 0x67, 0x70, 0x6d, 0x2c, 0xac, 0xf1, 0x58, 0x60, 0x85, 0x55, 0x8d, 0xc3, 0xa3, 0xdb, 0x95,
+ 0x60, 0x74, 0x63, 0xb1, 0xc0, 0x9a, 0x02, 0x97, 0xa4, 0x5e, 0x01, 0x2e, 0x89, 0x0a, 0x8f, 0xe9,
+ 0x45, 0x2b, 0x23, 0x61, 0xe1, 0x71, 0x2c, 0xed, 0xc8, 0x8c, 0xa7, 0x1d, 0xd2, 0xff, 0x06, 0x4e,
+ 0x37, 0x98, 0x5e, 0x1e, 0x40, 0xda, 0xb2, 0x55, 0x7b, 0x68, 0xf1, 0xdb, 0xf4, 0x68, 0xde, 0x5c,
+ 0x75, 0xc3, 0xf9, 0x71, 0x44, 0xc5, 0x65, 0xae, 0xe6, 0xf7, 0xf2, 0xd0, 0xa3, 0x8e, 0x27, 0xf5,
+ 0x5b, 0x1c, 0x4f, 0x13, 0xd2, 0xf8, 0x02, 0x0f, 0x6c, 0xab, 0x92, 0xa6, 0x2b, 0xbe, 0x3a, 0xb9,
+ 0x62, 0xd2, 0xbd, 0x55, 0x21, 0xf9, 0xcf, 0x7f, 0xbd, 0x58, 0x13, 0x19, 0xf7, 0x5b, 0x7a, 0x5f,
+ 0xb3, 0x71, 0xdf, 0xb0, 0x2f, 0x65, 0x2e, 0x2f, 0xbd, 0x0b, 0xa5, 0xe0, 0xa6, 0x47, 0xbb, 0x11,
+ 0xcf, 0x51, 0xc7, 0xa5, 0xbf, 0x17, 0x60, 0x39, 0x04, 0xdc, 0x41, 0x8f, 0x78, 0x41, 0x89, 0x1d,
+ 0xfc, 0xed, 0xc9, 0xdd, 0x0b, 0xb0, 0x7b, 0x75, 0x25, 0x12, 0x38, 0xbd, 0xe7, 0x03, 0x3b, 0x63,
+ 0x8f, 0x80, 0xde, 0x84, 0xb2, 0xa5, 0x9d, 0x0f, 0x14, 0x93, 0xe1, 0x44, 0x6e, 0xb1, 0x86, 0x64,
+ 0xf7, 0xa4, 0xc3, 0x29, 0x69, 0x76, 0x48, 0xf6, 0x83, 0x40, 0x54, 0xc6, 0xb8, 0xa5, 0x36, 0xa0,
+ 0xc9, 0xd7, 0x4c, 0x18, 0x92, 0x25, 0xbc, 0x02, 0x92, 0xf5, 0xb7, 0xb4, 0x94, 0x13, 0xf9, 0xc2,
+ 0x41, 0x9f, 0x8c, 0xdd, 0x8b, 0x0f, 0x16, 0x79, 0x1f, 0x6d, 0x30, 0x5a, 0xf0, 0x66, 0x48, 0x0f,
+ 0xa1, 0xe0, 0xa7, 0xcf, 0x77, 0x78, 0xbb, 0x5e, 0xfc, 0x0f, 0x22, 0x6e, 0xb7, 0xa1, 0x68, 0x62,
+ 0x9b, 0x38, 0xa9, 0x00, 0x44, 0x59, 0x60, 0x44, 0x96, 0xaa, 0xee, 0x26, 0xb3, 0x82, 0x18, 0x77,
+ 0xed, 0xe7, 0x5f, 0x04, 0x00, 0x0f, 0x86, 0xf3, 0x60, 0x30, 0xc1, 0x0f, 0x83, 0x8d, 0xa1, 0xa7,
+ 0xf1, 0x71, 0xf4, 0x14, 0xdd, 0x81, 0x32, 0x7b, 0x93, 0x90, 0x73, 0x53, 0xed, 0xa1, 0x89, 0x39,
+ 0xe8, 0x56, 0xa2, 0xe4, 0x23, 0x87, 0x8a, 0x3e, 0x87, 0xeb, 0x76, 0xd7, 0xc4, 0x56, 0x57, 0xef,
+ 0x75, 0x94, 0xf1, 0xb3, 0x63, 0xc5, 0xa0, 0xb5, 0x19, 0x46, 0x27, 0x5f, 0x73, 0x35, 0x9c, 0x04,
+ 0xcf, 0xef, 0x1b, 0x48, 0xd1, 0x6b, 0x43, 0x12, 0x3f, 0xd7, 0x8a, 0x73, 0xdc, 0x40, 0xbf, 0x00,
+ 0x50, 0x6d, 0xdb, 0xd4, 0x4e, 0x87, 0xc4, 0x3b, 0xc4, 0x27, 0x87, 0xf2, 0xae, 0x5d, 0xcd, 0xe1,
+ 0xdb, 0xba, 0xc9, 0xef, 0xdf, 0x8a, 0x27, 0xea, 0xbb, 0x83, 0x3e, 0x85, 0xd2, 0x3e, 0x94, 0x82,
+ 0xb2, 0x4e, 0x46, 0xcd, 0xe6, 0x10, 0xcc, 0xa8, 0x59, 0x86, 0xce, 0x33, 0x6a, 0x37, 0x1f, 0x4f,
+ 0xb0, 0xda, 0x2f, 0x6d, 0x48, 0xbf, 0x08, 0x50, 0xf0, 0x7b, 0xbd, 0xb9, 0x93, 0x5e, 0xfe, 0x08,
+ 0x48, 0x4c, 0x3e, 0x02, 0x92, 0xbe, 0x34, 0xf8, 0x3a, 0x64, 0x49, 0x1a, 0x3c, 0xb4, 0x70, 0x87,
+ 0x57, 0xc4, 0x33, 0xe7, 0xaa, 0x75, 0x6c, 0xe1, 0x8e, 0xcf, 0x37, 0x65, 0x5e, 0xcd, 0x37, 0x05,
+ 0x93, 0xe9, 0xec, 0x58, 0x32, 0xbd, 0x9b, 0xcc, 0xa6, 0xc4, 0xb4, 0xec, 0xcb, 0xc6, 0xa5, 0xbf,
+ 0x14, 0x20, 0xeb, 0xae, 0x37, 0x58, 0x0a, 0x0e, 0x00, 0xb5, 0x6c, 0xbb, 0x58, 0x21, 0x98, 0x3f,
+ 0x5f, 0x58, 0x61, 0x3c, 0xe1, 0x16, 0xc6, 0x3f, 0x74, 0x13, 0xc2, 0x28, 0x28, 0xd2, 0xbf, 0xb9,
+ 0x0e, 0xfa, 0xcc, 0xf3, 0xdf, 0xbf, 0xe1, 0xf3, 0x20, 0x19, 0x0b, 0xfa, 0x23, 0x48, 0xab, 0x6d,
+ 0x17, 0x80, 0x2d, 0x85, 0x20, 0x93, 0x0e, 0xeb, 0x46, 0x6b, 0x54, 0xa3, 0x9c, 0x32, 0x97, 0xe0,
+ 0xb3, 0x8a, 0x3b, 0xb3, 0x92, 0xf6, 0x88, 0x5e, 0xc6, 0x13, 0xbc, 0xe9, 0x25, 0x80, 0xe3, 0xfd,
+ 0xa7, 0x07, 0xdb, 0x3b, 0x8f, 0x77, 0x1a, 0xdb, 0x3c, 0xe3, 0xdb, 0xde, 0x6e, 0x6c, 0x8b, 0x71,
+ 0xc2, 0x27, 0x37, 0x9e, 0x1e, 0x9c, 0x34, 0xb6, 0xc5, 0x04, 0x69, 0x6c, 0x37, 0xf6, 0x6a, 0x9f,
+ 0x35, 0xb6, 0xc5, 0xa4, 0x54, 0x83, 0x9c, 0x1b, 0x74, 0xe8, 0x17, 0x04, 0xfa, 0x73, 0x6c, 0xf2,
+ 0xdd, 0x62, 0x0d, 0xb4, 0x0a, 0xf9, 0xc9, 0x0a, 0x02, 0x79, 0xc0, 0xb1, 0xc2, 0x01, 0x09, 0x03,
+ 0x65, 0x57, 0x07, 0x8f, 0x4d, 0x1f, 0x42, 0xc6, 0x18, 0x9e, 0x2a, 0x8e, 0xed, 0x8e, 0xe1, 0xee,
+ 0xce, 0xfb, 0x6e, 0x78, 0xda, 0xd3, 0xda, 0x4f, 0xf0, 0x25, 0x0f, 0x72, 0x69, 0x63, 0x78, 0xfa,
+ 0x84, 0x99, 0x38, 0x9b, 0x46, 0x7c, 0xca, 0x34, 0x12, 0x63, 0xd3, 0x40, 0x77, 0xa0, 0x30, 0xd0,
+ 0x3b, 0x58, 0x51, 0x3b, 0x1d, 0x13, 0x5b, 0x2c, 0x76, 0xe7, 0xb8, 0xe6, 0x3c, 0xe9, 0xa9, 0xb1,
+ 0x0e, 0xe9, 0x27, 0x01, 0xd0, 0x64, 0xa0, 0x45, 0x47, 0xb0, 0xe4, 0xc5, 0x6a, 0x27, 0x01, 0x60,
+ 0x91, 0x60, 0x3d, 0x3a, 0x50, 0x07, 0x30, 0x06, 0xf1, 0x22, 0x48, 0x26, 0x59, 0xdf, 0x8a, 0xe7,
+ 0xaa, 0x0c, 0xba, 0x5e, 0xba, 0x29, 0xf1, 0x39, 0x37, 0x25, 0x26, 0x23, 0x57, 0xde, 0xed, 0x19,
+ 0x77, 0xa5, 0x89, 0x89, 0x42, 0x94, 0x01, 0x95, 0xd6, 0x84, 0x18, 0x5f, 0x67, 0xd4, 0x94, 0x84,
+ 0x57, 0x99, 0x92, 0xf4, 0x10, 0xc4, 0x4f, 0xdc, 0xf1, 0xbd, 0xfc, 0xd1, 0x3f, 0x4d, 0x61, 0x62,
+ 0x9a, 0x17, 0x90, 0x25, 0xde, 0x97, 0x06, 0x8d, 0x3f, 0x86, 0x9c, 0xbb, 0x7b, 0xee, 0x47, 0x48,
+ 0x91, 0xdb, 0xce, 0x67, 0xe2, 0x89, 0xa0, 0x7b, 0xb0, 0x44, 0xe2, 0x86, 0x53, 0x0e, 0x66, 0x28,
+ 0x61, 0x9c, 0x7a, 0xc3, 0x32, 0xeb, 0xd8, 0x73, 0xa0, 0x2d, 0x12, 0xa3, 0x45, 0x16, 0xcb, 0x71,
+ 0xe7, 0xff, 0x63, 0x02, 0xe4, 0xdd, 0x37, 0x06, 0x96, 0xb2, 0x33, 0x2c, 0x06, 0x92, 0x09, 0xe9,
+ 0xcf, 0xe3, 0x90, 0xf7, 0x95, 0xa7, 0xd0, 0x1f, 0x06, 0x12, 0xab, 0xf5, 0x69, 0xa5, 0x2c, 0x5f,
+ 0x56, 0x15, 0x58, 0x58, 0x7c, 0xf1, 0x85, 0x45, 0x15, 0x06, 0x9d, 0x2a, 0x75, 0x72, 0xe1, 0x2a,
+ 0xf5, 0x5b, 0x80, 0x6c, 0xdd, 0x56, 0x7b, 0x24, 0x78, 0x6b, 0x83, 0x73, 0x85, 0xdd, 0x76, 0x56,
+ 0x19, 0x17, 0x69, 0xcf, 0x09, 0xed, 0x38, 0x24, 0x74, 0xa9, 0x07, 0x59, 0x17, 0x9c, 0x58, 0xfc,
+ 0xdb, 0x9e, 0xb0, 0x6a, 0x7c, 0x15, 0xb2, 0x7d, 0x6c, 0xab, 0x34, 0xec, 0x31, 0xb0, 0xca, 0x6d,
+ 0xdf, 0xfb, 0x00, 0xf2, 0xbe, 0x0f, 0x9e, 0x48, 0x24, 0xdc, 0x6f, 0x7c, 0x2a, 0xc6, 0xaa, 0x99,
+ 0x6f, 0xbf, 0x5f, 0x4f, 0xec, 0xe3, 0xe7, 0x64, 0x28, 0xb9, 0x51, 0x6f, 0x36, 0xea, 0x4f, 0x44,
+ 0xa1, 0x9a, 0xff, 0xf6, 0xfb, 0xf5, 0x8c, 0x8c, 0x69, 0x25, 0xe7, 0xde, 0x13, 0x28, 0x8f, 0x9d,
+ 0x40, 0xd0, 0x41, 0x23, 0x28, 0x6d, 0x1f, 0x1f, 0xee, 0xed, 0xd4, 0x6b, 0xad, 0x86, 0x72, 0x72,
+ 0xd0, 0x6a, 0x88, 0x02, 0xba, 0x06, 0xcb, 0x7b, 0x3b, 0x7f, 0xd2, 0x6c, 0x29, 0xf5, 0xbd, 0x9d,
+ 0xc6, 0x7e, 0x4b, 0xa9, 0xb5, 0x5a, 0xb5, 0xfa, 0x13, 0x31, 0xfe, 0xe0, 0x3f, 0x00, 0xca, 0xb5,
+ 0xad, 0xfa, 0x4e, 0xcd, 0x30, 0x7a, 0x5a, 0x5b, 0xa5, 0xee, 0xbe, 0x0e, 0x49, 0x8a, 0x3c, 0x4f,
+ 0xfd, 0xc0, 0xba, 0x3a, 0xbd, 0x3c, 0x87, 0x1e, 0x43, 0x8a, 0x82, 0xd2, 0x68, 0xfa, 0x17, 0xd7,
+ 0xd5, 0x19, 0xf5, 0x3a, 0x32, 0x19, 0x7a, 0x6f, 0xa6, 0x7e, 0x82, 0x5d, 0x9d, 0x5e, 0xbe, 0x43,
+ 0x7b, 0x90, 0x71, 0x00, 0xb9, 0x59, 0xdf, 0x45, 0x57, 0x67, 0xd6, 0xd4, 0xc8, 0xd2, 0x18, 0xb0,
+ 0x39, 0xfd, 0xeb, 0xec, 0xea, 0x8c, 0xc2, 0x1e, 0x92, 0x21, 0xe7, 0x41, 0xdd, 0xb3, 0x3f, 0x14,
+ 0xaf, 0xce, 0x51, 0x68, 0x44, 0x5f, 0x42, 0x31, 0x08, 0xdd, 0xcd, 0xf7, 0x0d, 0x77, 0x75, 0xce,
+ 0x22, 0x20, 0xd1, 0x1f, 0xc4, 0xf1, 0xe6, 0xfb, 0xa6, 0xbb, 0x3a, 0x67, 0x4d, 0x10, 0x7d, 0x05,
+ 0x4b, 0x93, 0x38, 0xdb, 0xfc, 0x9f, 0x78, 0x57, 0x17, 0xa8, 0x12, 0xa2, 0x3e, 0xa0, 0x10, 0x7c,
+ 0x6e, 0x81, 0x2f, 0xbe, 0xab, 0x8b, 0x14, 0x0d, 0x51, 0x07, 0xca, 0xe3, 0xd8, 0xd4, 0xbc, 0xdf,
+ 0x66, 0x57, 0xe7, 0xae, 0xec, 0xb1, 0x51, 0x82, 0x18, 0xc9, 0xbc, 0xdf, 0x6a, 0x57, 0xe7, 0x2e,
+ 0xf4, 0xa1, 0x63, 0x00, 0xdf, 0xdb, 0x76, 0x8e, 0x6f, 0xb7, 0xab, 0xf3, 0x94, 0xfc, 0x90, 0x01,
+ 0xcb, 0x61, 0x8f, 0xd9, 0x45, 0x3e, 0xe5, 0xae, 0x2e, 0x54, 0x09, 0x24, 0xf6, 0x1c, 0x7c, 0x97,
+ 0xce, 0xf7, 0x69, 0x77, 0x75, 0xce, 0x92, 0xe0, 0xd6, 0xd6, 0x0f, 0x2f, 0x57, 0x85, 0x1f, 0x5f,
+ 0xae, 0x0a, 0x3f, 0xbd, 0x5c, 0x15, 0xbe, 0xfb, 0x79, 0x35, 0xf6, 0xe3, 0xcf, 0xab, 0xb1, 0x7f,
+ 0xfb, 0x79, 0x35, 0xf6, 0xa7, 0x77, 0xcf, 0x35, 0xbb, 0x3b, 0x3c, 0xdd, 0x68, 0xeb, 0x7d, 0xfa,
+ 0xff, 0x1d, 0x43, 0xbd, 0xdc, 0x64, 0x3a, 0x49, 0xcb, 0xf7, 0x2f, 0xa1, 0xd3, 0x34, 0x8d, 0x75,
+ 0x0f, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x8b, 0x24, 0x0e, 0x7f, 0x45, 0x34, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -5548,6 +5676,29 @@ func (m *Request_FinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) {
}
return len(dAtA) - i, nil
}
+func (m *Request_FinalizeSnapshotSync) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *Request_FinalizeSnapshotSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ if m.FinalizeSnapshotSync != nil {
+ {
+ size, err := m.FinalizeSnapshotSync.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x1
+ i--
+ dAtA[i] = 0xa2
+ }
+ return len(dAtA) - i, nil
+}
func (m *RequestEcho) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -5716,12 +5867,12 @@ func (m *RequestInitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i--
dAtA[i] = 0x12
}
- n18, err18 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err18 != nil {
- return 0, err18
+ n19, err19 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err19 != nil {
+ return 0, err19
}
- i -= n18
- i = encodeVarintTypes(dAtA, i, uint64(n18))
+ i -= n19
+ i = encodeVarintTypes(dAtA, i, uint64(n19))
i--
dAtA[i] = 0xa
return len(dAtA) - i, nil
@@ -5963,6 +6114,53 @@ func (m *RequestApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, erro
return len(dAtA) - i, nil
}
+func (m *RequestFinalizeSnapshotSync) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *RequestFinalizeSnapshotSync) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *RequestFinalizeSnapshotSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if m.Commit != nil {
+ {
+ size, err := m.Commit.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x12
+ }
+ if m.LightBlock != nil {
+ {
+ size, err := m.LightBlock.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
func (m *RequestPrepareProposal) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -6031,12 +6229,12 @@ func (m *RequestPrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error)
i--
dAtA[i] = 0x3a
}
- n21, err21 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err21 != nil {
- return 0, err21
+ n24, err24 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err24 != nil {
+ return 0, err24
}
- i -= n21
- i = encodeVarintTypes(dAtA, i, uint64(n21))
+ i -= n24
+ i = encodeVarintTypes(dAtA, i, uint64(n24))
i--
dAtA[i] = 0x32
if m.Height != 0 {
@@ -6160,12 +6358,12 @@ func (m *RequestProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error)
i--
dAtA[i] = 0x42
}
- n25, err25 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err25 != nil {
- return 0, err25
+ n28, err28 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err28 != nil {
+ return 0, err28
}
- i -= n25
- i = encodeVarintTypes(dAtA, i, uint64(n25))
+ i -= n28
+ i = encodeVarintTypes(dAtA, i, uint64(n28))
i--
dAtA[i] = 0x3a
if m.Round != 0 {
@@ -6780,6 +6978,29 @@ func (m *Response_FinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error)
}
return len(dAtA) - i, nil
}
+func (m *Response_FinalizeSnapshotSync) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *Response_FinalizeSnapshotSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ if m.FinalizeSnapshotSync != nil {
+ {
+ size, err := m.FinalizeSnapshotSync.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x1
+ i--
+ dAtA[i] = 0x8a
+ }
+ return len(dAtA) - i, nil
+}
func (m *ResponseException) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -7003,12 +7224,12 @@ func (m *ResponseInitChain_GenesisTime) MarshalTo(dAtA []byte) (int, error) {
func (m *ResponseInitChain_GenesisTime) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
if m.GenesisTime != nil {
- n49, err49 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.GenesisTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.GenesisTime):])
- if err49 != nil {
- return 0, err49
+ n53, err53 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.GenesisTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.GenesisTime):])
+ if err53 != nil {
+ return 0, err53
}
- i -= n49
- i = encodeVarintTypes(dAtA, i, uint64(n49))
+ i -= n53
+ i = encodeVarintTypes(dAtA, i, uint64(n53))
i--
dAtA[i] = 0x32
}
@@ -7315,6 +7536,29 @@ func (m *ResponseApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, err
return len(dAtA) - i, nil
}
+func (m *ResponseFinalizeSnapshotSync) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *ResponseFinalizeSnapshotSync) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *ResponseFinalizeSnapshotSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ return len(dAtA) - i, nil
+}
+
func (m *ResponsePrepareProposal) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -8285,12 +8529,12 @@ func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i--
dAtA[i] = 0x28
}
- n62, err62 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err62 != nil {
- return 0, err62
+ n66, err66 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err66 != nil {
+ return 0, err66
}
- i -= n62
- i = encodeVarintTypes(dAtA, i, uint64(n62))
+ i -= n66
+ i = encodeVarintTypes(dAtA, i, uint64(n66))
i--
dAtA[i] = 0x22
if m.Height != 0 {
@@ -8566,6 +8810,18 @@ func (m *Request_FinalizeBlock) Size() (n int) {
}
return n
}
+func (m *Request_FinalizeSnapshotSync) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ if m.FinalizeSnapshotSync != nil {
+ l = m.FinalizeSnapshotSync.Size()
+ n += 2 + l + sovTypes(uint64(l))
+ }
+ return n
+}
func (m *RequestEcho) Size() (n int) {
if m == nil {
return 0
@@ -8749,6 +9005,23 @@ func (m *RequestApplySnapshotChunk) Size() (n int) {
return n
}
+func (m *RequestFinalizeSnapshotSync) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ if m.LightBlock != nil {
+ l = m.LightBlock.Size()
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ if m.Commit != nil {
+ l = m.Commit.Size()
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ return n
+}
+
func (m *RequestPrepareProposal) Size() (n int) {
if m == nil {
return 0
@@ -9153,6 +9426,18 @@ func (m *Response_FinalizeBlock) Size() (n int) {
}
return n
}
+func (m *Response_FinalizeSnapshotSync) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ if m.FinalizeSnapshotSync != nil {
+ l = m.FinalizeSnapshotSync.Size()
+ n += 2 + l + sovTypes(uint64(l))
+ }
+ return n
+}
func (m *ResponseException) Size() (n int) {
if m == nil {
return 0
@@ -9402,6 +9687,15 @@ func (m *ResponseApplySnapshotChunk) Size() (n int) {
return n
}
+func (m *ResponseFinalizeSnapshotSync) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ return n
+}
+
func (m *ResponsePrepareProposal) Size() (n int) {
if m == nil {
return 0
@@ -10409,6 +10703,41 @@ func (m *Request) Unmarshal(dAtA []byte) error {
}
m.Value = &Request_FinalizeBlock{v}
iNdEx = postIndex
+ case 20:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field FinalizeSnapshotSync", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ v := &RequestFinalizeSnapshotSync{}
+ if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ m.Value = &Request_FinalizeSnapshotSync{v}
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipTypes(dAtA[iNdEx:])
@@ -11673,6 +12002,128 @@ func (m *RequestApplySnapshotChunk) Unmarshal(dAtA []byte) error {
}
return nil
}
+func (m *RequestFinalizeSnapshotSync) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: RequestFinalizeSnapshotSync: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: RequestFinalizeSnapshotSync: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field LightBlock", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.LightBlock == nil {
+ m.LightBlock = &types1.LightBlock{}
+ }
+ if err := m.LightBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Commit", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.Commit == nil {
+ m.Commit = &types1.Commit{}
+ }
+ if err := m.Commit.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipTypes(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
func (m *RequestPrepareProposal) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
@@ -13716,6 +14167,41 @@ func (m *Response) Unmarshal(dAtA []byte) error {
}
m.Value = &Response_FinalizeBlock{v}
iNdEx = postIndex
+ case 17:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field FinalizeSnapshotSync", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ v := &ResponseFinalizeSnapshotSync{}
+ if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ m.Value = &Response_FinalizeSnapshotSync{v}
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipTypes(dAtA[iNdEx:])
@@ -15326,6 +15812,56 @@ func (m *ResponseApplySnapshotChunk) Unmarshal(dAtA []byte) error {
}
return nil
}
+func (m *ResponseFinalizeSnapshotSync) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: ResponseFinalizeSnapshotSync: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: ResponseFinalizeSnapshotSync: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ default:
+ iNdEx = preIndex
+ skippy, err := skipTypes(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
func (m *ResponsePrepareProposal) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
diff --git a/light/example_test.go b/light/example_test.go
index 55b93fedae..74fcf6b41c 100644
--- a/light/example_test.go
+++ b/light/example_test.go
@@ -2,6 +2,7 @@ package light_test
import (
"context"
+ "encoding/hex"
"testing"
"time"
@@ -113,3 +114,93 @@ func TestExampleClient(t *testing.T) {
logger.Info("verified light block", "light-block", lb)
}
+
+// Manually getting light blocks and verifying them.
+func TestClientLocalDevnet(t *testing.T) {
+ const CHAINID = "dashmate_local_12"
+
+ if testing.Short() {
+ t.Skip("skipping test in short mode")
+ }
+
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ logger, err := log.NewDefaultLogger(log.LogFormatPlain, log.LogLevelTrace)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Start a test application
+ // app, err := kvstore.NewMemoryApp()
+ // require.NoError(t, err)
+
+ primary, err := httpp.New(CHAINID, "10.56.229.104:34657")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // give Tendermint time to generate some blocks
+ time.Sleep(5 * time.Second)
+
+ _, err = primary.LightBlock(ctx, 1)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ db := dbm.NewMemDB()
+
+ // pv, err := privval.LoadOrGenFilePV(conf.PrivValidator.KeyFile(), conf.PrivValidator.StateFile())
+ require.NoError(t, err)
+ coreClient, err := dashcore.NewRPCClient("10.56.229.104:30002",
+ "tenderdash", "IAzIcGlDfuow",
+ logger)
+ require.NoError(t, err)
+
+ trusted, err := hex.DecodeString("5EA22033B1855219F7579554EE75CBB48C25CDF7DF2AD6C1FD5428C1BA74CFE4")
+ require.NoError(t, err)
+
+ c, err := light.NewClientAtHeight(
+ ctx,
+ 1,
+ trusted,
+ CHAINID,
+ primary,
+ nil,
+ dbs.New(db),
+ coreClient,
+ light.Logger(logger),
+ )
+
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer func() {
+ if err := c.Cleanup(); err != nil {
+ t.Fatal(err)
+ }
+ }()
+
+ // wait for a few more blocks to be produced
+ time.Sleep(2 * time.Second)
+
+ // verify the block at height 3
+ _, err = c.VerifyLightBlockAtHeight(ctx, 3, time.Now())
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // retrieve light block at height 3
+ _, err = c.TrustedLightBlock(3)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // update to the latest height
+ lb, err := c.Update(ctx, time.Now())
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ logger.Info("verified light block", "light-block", lb)
+}
diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto
index 3453c1ce4a..70b2755b85 100644
--- a/proto/tendermint/abci/types.proto
+++ b/proto/tendermint/abci/types.proto
@@ -22,21 +22,22 @@ import "gogoproto/gogo.proto";
// Request types
message Request {
oneof value {
- RequestEcho echo = 1;
- RequestFlush flush = 2;
- RequestInfo info = 3;
- RequestInitChain init_chain = 4;
- RequestQuery query = 5;
- RequestCheckTx check_tx = 7;
- RequestListSnapshots list_snapshots = 11;
- RequestOfferSnapshot offer_snapshot = 12;
- RequestLoadSnapshotChunk load_snapshot_chunk = 13;
- RequestApplySnapshotChunk apply_snapshot_chunk = 14;
- RequestPrepareProposal prepare_proposal = 15;
- RequestProcessProposal process_proposal = 16;
- RequestExtendVote extend_vote = 17;
- RequestVerifyVoteExtension verify_vote_extension = 18;
- RequestFinalizeBlock finalize_block = 19;
+ RequestEcho echo = 1;
+ RequestFlush flush = 2;
+ RequestInfo info = 3;
+ RequestInitChain init_chain = 4;
+ RequestQuery query = 5;
+ RequestCheckTx check_tx = 7;
+ RequestListSnapshots list_snapshots = 11;
+ RequestOfferSnapshot offer_snapshot = 12;
+ RequestLoadSnapshotChunk load_snapshot_chunk = 13;
+ RequestApplySnapshotChunk apply_snapshot_chunk = 14;
+ RequestFinalizeSnapshotSync finalize_snapshot_sync = 20;
+ RequestPrepareProposal prepare_proposal = 15;
+ RequestProcessProposal process_proposal = 16;
+ RequestExtendVote extend_vote = 17;
+ RequestVerifyVoteExtension verify_vote_extension = 18;
+ RequestFinalizeBlock finalize_block = 19;
}
reserved 6, 8, 9, 10; // RequestBeginBlock, RequestDeliverTx, RequestEndBlock, RequestCommit
}
@@ -183,6 +184,16 @@ message RequestApplySnapshotChunk {
string sender = 3; // The P2P ID of the node who sent this chunk.
}
+// After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
+// It includes the light block committed at the synced height, which Tenderdash uses
+// to reconstruct its own state.
+message RequestFinalizeSnapshotSync {
+ // light block committed at the synced height
+ tendermint.types.LightBlock light_block = 1;
+ // commit fot the `light_block`
+ tendermint.types.Commit commit = 2;
+}
+
// Prepare new block proposal, potentially altering list of transactions.
//
// #### Usage
@@ -503,22 +514,23 @@ message RequestFinalizeBlock {
message Response {
oneof value {
- ResponseException exception = 1;
- ResponseEcho echo = 2;
- ResponseFlush flush = 3;
- ResponseInfo info = 4;
- ResponseInitChain init_chain = 5;
- ResponseQuery query = 6;
- ResponseCheckTx check_tx = 7;
- ResponseListSnapshots list_snapshots = 8;
- ResponseOfferSnapshot offer_snapshot = 9;
- ResponseLoadSnapshotChunk load_snapshot_chunk = 10;
- ResponseApplySnapshotChunk apply_snapshot_chunk = 11;
- ResponsePrepareProposal prepare_proposal = 12;
- ResponseProcessProposal process_proposal = 13;
- ResponseExtendVote extend_vote = 14;
- ResponseVerifyVoteExtension verify_vote_extension = 15;
- ResponseFinalizeBlock finalize_block = 16;
+ ResponseException exception = 1;
+ ResponseEcho echo = 2;
+ ResponseFlush flush = 3;
+ ResponseInfo info = 4;
+ ResponseInitChain init_chain = 5;
+ ResponseQuery query = 6;
+ ResponseCheckTx check_tx = 7;
+ ResponseListSnapshots list_snapshots = 8;
+ ResponseOfferSnapshot offer_snapshot = 9;
+ ResponseLoadSnapshotChunk load_snapshot_chunk = 10;
+ ResponseApplySnapshotChunk apply_snapshot_chunk = 11;
+ ResponseFinalizeSnapshotSync finalize_snapshot_sync = 17;
+ ResponsePrepareProposal prepare_proposal = 12;
+ ResponseProcessProposal process_proposal = 13;
+ ResponseExtendVote extend_vote = 14;
+ ResponseVerifyVoteExtension verify_vote_extension = 15;
+ ResponseFinalizeBlock finalize_block = 16;
}
}
@@ -629,6 +641,10 @@ message ResponseApplySnapshotChunk {
}
}
+// The response to a `RequestPrepareSnapshot` message.
+message ResponseFinalizeSnapshotSync {
+}
+
message ResponsePrepareProposal {
// Possibly modified list of transactions that have been picked as part of the proposed block.
repeated TxRecord tx_records = 1;
diff --git a/spec/abci++/api.md b/spec/abci++/api.md
index 6162aaf3b2..9945f1071b 100644
--- a/spec/abci++/api.md
+++ b/spec/abci++/api.md
@@ -18,6 +18,7 @@
- [RequestEcho](#tendermint-abci-RequestEcho)
- [RequestExtendVote](#tendermint-abci-RequestExtendVote)
- [RequestFinalizeBlock](#tendermint-abci-RequestFinalizeBlock)
+ - [RequestFinalizeSnapshotSync](#tendermint-abci-RequestFinalizeSnapshotSync)
- [RequestFlush](#tendermint-abci-RequestFlush)
- [RequestInfo](#tendermint-abci-RequestInfo)
- [RequestInitChain](#tendermint-abci-RequestInitChain)
@@ -35,6 +36,7 @@
- [ResponseException](#tendermint-abci-ResponseException)
- [ResponseExtendVote](#tendermint-abci-ResponseExtendVote)
- [ResponseFinalizeBlock](#tendermint-abci-ResponseFinalizeBlock)
+ - [ResponseFinalizeSnapshotSync](#tendermint-abci-ResponseFinalizeSnapshotSync)
- [ResponseFlush](#tendermint-abci-ResponseFlush)
- [ResponseInfo](#tendermint-abci-ResponseInfo)
- [ResponseInitChain](#tendermint-abci-ResponseInitChain)
@@ -247,6 +249,7 @@ Request types
| offer_snapshot | [RequestOfferSnapshot](#tendermint-abci-RequestOfferSnapshot) | | |
| load_snapshot_chunk | [RequestLoadSnapshotChunk](#tendermint-abci-RequestLoadSnapshotChunk) | | |
| apply_snapshot_chunk | [RequestApplySnapshotChunk](#tendermint-abci-RequestApplySnapshotChunk) | | |
+| finalize_snapshot_sync | [RequestFinalizeSnapshotSync](#tendermint-abci-RequestFinalizeSnapshotSync) | | |
| prepare_proposal | [RequestPrepareProposal](#tendermint-abci-RequestPrepareProposal) | | |
| process_proposal | [RequestProcessProposal](#tendermint-abci-RequestProcessProposal) | | |
| extend_vote | [RequestExtendVote](#tendermint-abci-RequestExtendVote) | | |
@@ -423,6 +426,24 @@ Finalize newly decided block.
+
+
+### RequestFinalizeSnapshotSync
+After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
+It includes the light block committed at the synced height, which Tenderdash uses
+to reconstruct its own state.
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| light_block | [tendermint.types.LightBlock](#tendermint-types-LightBlock) | | light block committed at the synced height |
+| commit | [tendermint.types.Commit](#tendermint-types-Commit) | | commit fot the `light_block` |
+
+
+
+
+
+
### RequestFlush
@@ -809,6 +830,7 @@ from this condition, but not sure), and _p_ receives a Precommit message for rou
| offer_snapshot | [ResponseOfferSnapshot](#tendermint-abci-ResponseOfferSnapshot) | | |
| load_snapshot_chunk | [ResponseLoadSnapshotChunk](#tendermint-abci-ResponseLoadSnapshotChunk) | | |
| apply_snapshot_chunk | [ResponseApplySnapshotChunk](#tendermint-abci-ResponseApplySnapshotChunk) | | |
+| finalize_snapshot_sync | [ResponseFinalizeSnapshotSync](#tendermint-abci-ResponseFinalizeSnapshotSync) | | |
| prepare_proposal | [ResponsePrepareProposal](#tendermint-abci-ResponsePrepareProposal) | | |
| process_proposal | [ResponseProcessProposal](#tendermint-abci-ResponseProcessProposal) | | |
| extend_vote | [ResponseExtendVote](#tendermint-abci-ResponseExtendVote) | | |
@@ -919,6 +941,16 @@ nondeterministic
+
+
+### ResponseFinalizeSnapshotSync
+The response to a `RequestPrepareSnapshot` message.
+
+
+
+
+
+
### ResponseFlush
From c1edaf6b9898a21f17541794d14d91bf9b699c06 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 15 Jan 2025 15:18:34 +0100
Subject: [PATCH 06/42] build: bump abci version minor
---
version/version.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/version/version.go b/version/version.go
index e2db669794..df7d4822e8 100644
--- a/version/version.go
+++ b/version/version.go
@@ -11,7 +11,7 @@ const (
// when not using git describe. It is formatted with semantic versioning.
TMVersionDefault = "1.4.0"
// ABCISemVer is the semantic version of the ABCI library
- ABCISemVer = "1.2.0"
+ ABCISemVer = "1.3.0"
ABCIVersion = ABCISemVer
)
From f89ed874f295784f3c10759d0612b64ab8ae82cb Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 15 Jan 2025 15:24:05 +0100
Subject: [PATCH 07/42] chore: rename finalize snapshot request
---
abci/types/types.pb.go | 704 +++++++++++++++---------------
proto/tendermint/abci/types.proto | 70 +--
spec/abci++/api.md | 16 +-
3 files changed, 395 insertions(+), 395 deletions(-)
diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go
index 8f7432f1af..73c13f07fd 100644
--- a/abci/types/types.pb.go
+++ b/abci/types/types.pb.go
@@ -271,7 +271,7 @@ type Request struct {
// *Request_OfferSnapshot
// *Request_LoadSnapshotChunk
// *Request_ApplySnapshotChunk
- // *Request_FinalizeSnapshotSync
+ // *Request_FinalizeSnapshot
// *Request_PrepareProposal
// *Request_ProcessProposal
// *Request_ExtendVote
@@ -349,8 +349,8 @@ type Request_LoadSnapshotChunk struct {
type Request_ApplySnapshotChunk struct {
ApplySnapshotChunk *RequestApplySnapshotChunk `protobuf:"bytes,14,opt,name=apply_snapshot_chunk,json=applySnapshotChunk,proto3,oneof" json:"apply_snapshot_chunk,omitempty"`
}
-type Request_FinalizeSnapshotSync struct {
- FinalizeSnapshotSync *RequestFinalizeSnapshotSync `protobuf:"bytes,20,opt,name=finalize_snapshot_sync,json=finalizeSnapshotSync,proto3,oneof" json:"finalize_snapshot_sync,omitempty"`
+type Request_FinalizeSnapshot struct {
+ FinalizeSnapshot *RequestFinalizeSnapshot `protobuf:"bytes,20,opt,name=finalize_snapshot,json=finalizeSnapshot,proto3,oneof" json:"finalize_snapshot,omitempty"`
}
type Request_PrepareProposal struct {
PrepareProposal *RequestPrepareProposal `protobuf:"bytes,15,opt,name=prepare_proposal,json=prepareProposal,proto3,oneof" json:"prepare_proposal,omitempty"`
@@ -368,22 +368,22 @@ type Request_FinalizeBlock struct {
FinalizeBlock *RequestFinalizeBlock `protobuf:"bytes,19,opt,name=finalize_block,json=finalizeBlock,proto3,oneof" json:"finalize_block,omitempty"`
}
-func (*Request_Echo) isRequest_Value() {}
-func (*Request_Flush) isRequest_Value() {}
-func (*Request_Info) isRequest_Value() {}
-func (*Request_InitChain) isRequest_Value() {}
-func (*Request_Query) isRequest_Value() {}
-func (*Request_CheckTx) isRequest_Value() {}
-func (*Request_ListSnapshots) isRequest_Value() {}
-func (*Request_OfferSnapshot) isRequest_Value() {}
-func (*Request_LoadSnapshotChunk) isRequest_Value() {}
-func (*Request_ApplySnapshotChunk) isRequest_Value() {}
-func (*Request_FinalizeSnapshotSync) isRequest_Value() {}
-func (*Request_PrepareProposal) isRequest_Value() {}
-func (*Request_ProcessProposal) isRequest_Value() {}
-func (*Request_ExtendVote) isRequest_Value() {}
-func (*Request_VerifyVoteExtension) isRequest_Value() {}
-func (*Request_FinalizeBlock) isRequest_Value() {}
+func (*Request_Echo) isRequest_Value() {}
+func (*Request_Flush) isRequest_Value() {}
+func (*Request_Info) isRequest_Value() {}
+func (*Request_InitChain) isRequest_Value() {}
+func (*Request_Query) isRequest_Value() {}
+func (*Request_CheckTx) isRequest_Value() {}
+func (*Request_ListSnapshots) isRequest_Value() {}
+func (*Request_OfferSnapshot) isRequest_Value() {}
+func (*Request_LoadSnapshotChunk) isRequest_Value() {}
+func (*Request_ApplySnapshotChunk) isRequest_Value() {}
+func (*Request_FinalizeSnapshot) isRequest_Value() {}
+func (*Request_PrepareProposal) isRequest_Value() {}
+func (*Request_ProcessProposal) isRequest_Value() {}
+func (*Request_ExtendVote) isRequest_Value() {}
+func (*Request_VerifyVoteExtension) isRequest_Value() {}
+func (*Request_FinalizeBlock) isRequest_Value() {}
func (m *Request) GetValue() isRequest_Value {
if m != nil {
@@ -462,9 +462,9 @@ func (m *Request) GetApplySnapshotChunk() *RequestApplySnapshotChunk {
return nil
}
-func (m *Request) GetFinalizeSnapshotSync() *RequestFinalizeSnapshotSync {
- if x, ok := m.GetValue().(*Request_FinalizeSnapshotSync); ok {
- return x.FinalizeSnapshotSync
+func (m *Request) GetFinalizeSnapshot() *RequestFinalizeSnapshot {
+ if x, ok := m.GetValue().(*Request_FinalizeSnapshot); ok {
+ return x.FinalizeSnapshot
}
return nil
}
@@ -517,7 +517,7 @@ func (*Request) XXX_OneofWrappers() []interface{} {
(*Request_OfferSnapshot)(nil),
(*Request_LoadSnapshotChunk)(nil),
(*Request_ApplySnapshotChunk)(nil),
- (*Request_FinalizeSnapshotSync)(nil),
+ (*Request_FinalizeSnapshot)(nil),
(*Request_PrepareProposal)(nil),
(*Request_ProcessProposal)(nil),
(*Request_ExtendVote)(nil),
@@ -1177,25 +1177,25 @@ func (m *RequestApplySnapshotChunk) GetSender() string {
// After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
// It includes the light block committed at the synced height, which Tenderdash uses
// to reconstruct its own state.
-type RequestFinalizeSnapshotSync struct {
+type RequestFinalizeSnapshot struct {
// light block committed at the synced height
LightBlock *types1.LightBlock `protobuf:"bytes,1,opt,name=light_block,json=lightBlock,proto3" json:"light_block,omitempty"`
// commit fot the `light_block`
Commit *types1.Commit `protobuf:"bytes,2,opt,name=commit,proto3" json:"commit,omitempty"`
}
-func (m *RequestFinalizeSnapshotSync) Reset() { *m = RequestFinalizeSnapshotSync{} }
-func (m *RequestFinalizeSnapshotSync) String() string { return proto.CompactTextString(m) }
-func (*RequestFinalizeSnapshotSync) ProtoMessage() {}
-func (*RequestFinalizeSnapshotSync) Descriptor() ([]byte, []int) {
+func (m *RequestFinalizeSnapshot) Reset() { *m = RequestFinalizeSnapshot{} }
+func (m *RequestFinalizeSnapshot) String() string { return proto.CompactTextString(m) }
+func (*RequestFinalizeSnapshot) ProtoMessage() {}
+func (*RequestFinalizeSnapshot) Descriptor() ([]byte, []int) {
return fileDescriptor_252557cfdd89a31a, []int{11}
}
-func (m *RequestFinalizeSnapshotSync) XXX_Unmarshal(b []byte) error {
+func (m *RequestFinalizeSnapshot) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
-func (m *RequestFinalizeSnapshotSync) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+func (m *RequestFinalizeSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
- return xxx_messageInfo_RequestFinalizeSnapshotSync.Marshal(b, m, deterministic)
+ return xxx_messageInfo_RequestFinalizeSnapshot.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
@@ -1205,26 +1205,26 @@ func (m *RequestFinalizeSnapshotSync) XXX_Marshal(b []byte, deterministic bool)
return b[:n], nil
}
}
-func (m *RequestFinalizeSnapshotSync) XXX_Merge(src proto.Message) {
- xxx_messageInfo_RequestFinalizeSnapshotSync.Merge(m, src)
+func (m *RequestFinalizeSnapshot) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_RequestFinalizeSnapshot.Merge(m, src)
}
-func (m *RequestFinalizeSnapshotSync) XXX_Size() int {
+func (m *RequestFinalizeSnapshot) XXX_Size() int {
return m.Size()
}
-func (m *RequestFinalizeSnapshotSync) XXX_DiscardUnknown() {
- xxx_messageInfo_RequestFinalizeSnapshotSync.DiscardUnknown(m)
+func (m *RequestFinalizeSnapshot) XXX_DiscardUnknown() {
+ xxx_messageInfo_RequestFinalizeSnapshot.DiscardUnknown(m)
}
-var xxx_messageInfo_RequestFinalizeSnapshotSync proto.InternalMessageInfo
+var xxx_messageInfo_RequestFinalizeSnapshot proto.InternalMessageInfo
-func (m *RequestFinalizeSnapshotSync) GetLightBlock() *types1.LightBlock {
+func (m *RequestFinalizeSnapshot) GetLightBlock() *types1.LightBlock {
if m != nil {
return m.LightBlock
}
return nil
}
-func (m *RequestFinalizeSnapshotSync) GetCommit() *types1.Commit {
+func (m *RequestFinalizeSnapshot) GetCommit() *types1.Commit {
if m != nil {
return m.Commit
}
@@ -2020,7 +2020,7 @@ type Response struct {
// *Response_OfferSnapshot
// *Response_LoadSnapshotChunk
// *Response_ApplySnapshotChunk
- // *Response_FinalizeSnapshotSync
+ // *Response_FinalizeSnapshot
// *Response_PrepareProposal
// *Response_ProcessProposal
// *Response_ExtendVote
@@ -2101,8 +2101,8 @@ type Response_LoadSnapshotChunk struct {
type Response_ApplySnapshotChunk struct {
ApplySnapshotChunk *ResponseApplySnapshotChunk `protobuf:"bytes,11,opt,name=apply_snapshot_chunk,json=applySnapshotChunk,proto3,oneof" json:"apply_snapshot_chunk,omitempty"`
}
-type Response_FinalizeSnapshotSync struct {
- FinalizeSnapshotSync *ResponseFinalizeSnapshotSync `protobuf:"bytes,17,opt,name=finalize_snapshot_sync,json=finalizeSnapshotSync,proto3,oneof" json:"finalize_snapshot_sync,omitempty"`
+type Response_FinalizeSnapshot struct {
+ FinalizeSnapshot *ResponseFinalizeSnapshot `protobuf:"bytes,17,opt,name=finalize_snapshot,json=finalizeSnapshot,proto3,oneof" json:"finalize_snapshot,omitempty"`
}
type Response_PrepareProposal struct {
PrepareProposal *ResponsePrepareProposal `protobuf:"bytes,12,opt,name=prepare_proposal,json=prepareProposal,proto3,oneof" json:"prepare_proposal,omitempty"`
@@ -2120,23 +2120,23 @@ type Response_FinalizeBlock struct {
FinalizeBlock *ResponseFinalizeBlock `protobuf:"bytes,16,opt,name=finalize_block,json=finalizeBlock,proto3,oneof" json:"finalize_block,omitempty"`
}
-func (*Response_Exception) isResponse_Value() {}
-func (*Response_Echo) isResponse_Value() {}
-func (*Response_Flush) isResponse_Value() {}
-func (*Response_Info) isResponse_Value() {}
-func (*Response_InitChain) isResponse_Value() {}
-func (*Response_Query) isResponse_Value() {}
-func (*Response_CheckTx) isResponse_Value() {}
-func (*Response_ListSnapshots) isResponse_Value() {}
-func (*Response_OfferSnapshot) isResponse_Value() {}
-func (*Response_LoadSnapshotChunk) isResponse_Value() {}
-func (*Response_ApplySnapshotChunk) isResponse_Value() {}
-func (*Response_FinalizeSnapshotSync) isResponse_Value() {}
-func (*Response_PrepareProposal) isResponse_Value() {}
-func (*Response_ProcessProposal) isResponse_Value() {}
-func (*Response_ExtendVote) isResponse_Value() {}
-func (*Response_VerifyVoteExtension) isResponse_Value() {}
-func (*Response_FinalizeBlock) isResponse_Value() {}
+func (*Response_Exception) isResponse_Value() {}
+func (*Response_Echo) isResponse_Value() {}
+func (*Response_Flush) isResponse_Value() {}
+func (*Response_Info) isResponse_Value() {}
+func (*Response_InitChain) isResponse_Value() {}
+func (*Response_Query) isResponse_Value() {}
+func (*Response_CheckTx) isResponse_Value() {}
+func (*Response_ListSnapshots) isResponse_Value() {}
+func (*Response_OfferSnapshot) isResponse_Value() {}
+func (*Response_LoadSnapshotChunk) isResponse_Value() {}
+func (*Response_ApplySnapshotChunk) isResponse_Value() {}
+func (*Response_FinalizeSnapshot) isResponse_Value() {}
+func (*Response_PrepareProposal) isResponse_Value() {}
+func (*Response_ProcessProposal) isResponse_Value() {}
+func (*Response_ExtendVote) isResponse_Value() {}
+func (*Response_VerifyVoteExtension) isResponse_Value() {}
+func (*Response_FinalizeBlock) isResponse_Value() {}
func (m *Response) GetValue() isResponse_Value {
if m != nil {
@@ -2222,9 +2222,9 @@ func (m *Response) GetApplySnapshotChunk() *ResponseApplySnapshotChunk {
return nil
}
-func (m *Response) GetFinalizeSnapshotSync() *ResponseFinalizeSnapshotSync {
- if x, ok := m.GetValue().(*Response_FinalizeSnapshotSync); ok {
- return x.FinalizeSnapshotSync
+func (m *Response) GetFinalizeSnapshot() *ResponseFinalizeSnapshot {
+ if x, ok := m.GetValue().(*Response_FinalizeSnapshot); ok {
+ return x.FinalizeSnapshot
}
return nil
}
@@ -2278,7 +2278,7 @@ func (*Response) XXX_OneofWrappers() []interface{} {
(*Response_OfferSnapshot)(nil),
(*Response_LoadSnapshotChunk)(nil),
(*Response_ApplySnapshotChunk)(nil),
- (*Response_FinalizeSnapshotSync)(nil),
+ (*Response_FinalizeSnapshot)(nil),
(*Response_PrepareProposal)(nil),
(*Response_ProcessProposal)(nil),
(*Response_ExtendVote)(nil),
@@ -3019,21 +3019,21 @@ func (m *ResponseApplySnapshotChunk) GetNextChunks() [][]byte {
}
// The response to a `RequestPrepareSnapshot` message.
-type ResponseFinalizeSnapshotSync struct {
+type ResponseFinalizeSnapshot struct {
}
-func (m *ResponseFinalizeSnapshotSync) Reset() { *m = ResponseFinalizeSnapshotSync{} }
-func (m *ResponseFinalizeSnapshotSync) String() string { return proto.CompactTextString(m) }
-func (*ResponseFinalizeSnapshotSync) ProtoMessage() {}
-func (*ResponseFinalizeSnapshotSync) Descriptor() ([]byte, []int) {
+func (m *ResponseFinalizeSnapshot) Reset() { *m = ResponseFinalizeSnapshot{} }
+func (m *ResponseFinalizeSnapshot) String() string { return proto.CompactTextString(m) }
+func (*ResponseFinalizeSnapshot) ProtoMessage() {}
+func (*ResponseFinalizeSnapshot) Descriptor() ([]byte, []int) {
return fileDescriptor_252557cfdd89a31a, []int{29}
}
-func (m *ResponseFinalizeSnapshotSync) XXX_Unmarshal(b []byte) error {
+func (m *ResponseFinalizeSnapshot) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
-func (m *ResponseFinalizeSnapshotSync) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+func (m *ResponseFinalizeSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
- return xxx_messageInfo_ResponseFinalizeSnapshotSync.Marshal(b, m, deterministic)
+ return xxx_messageInfo_ResponseFinalizeSnapshot.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
@@ -3043,17 +3043,17 @@ func (m *ResponseFinalizeSnapshotSync) XXX_Marshal(b []byte, deterministic bool)
return b[:n], nil
}
}
-func (m *ResponseFinalizeSnapshotSync) XXX_Merge(src proto.Message) {
- xxx_messageInfo_ResponseFinalizeSnapshotSync.Merge(m, src)
+func (m *ResponseFinalizeSnapshot) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_ResponseFinalizeSnapshot.Merge(m, src)
}
-func (m *ResponseFinalizeSnapshotSync) XXX_Size() int {
+func (m *ResponseFinalizeSnapshot) XXX_Size() int {
return m.Size()
}
-func (m *ResponseFinalizeSnapshotSync) XXX_DiscardUnknown() {
- xxx_messageInfo_ResponseFinalizeSnapshotSync.DiscardUnknown(m)
+func (m *ResponseFinalizeSnapshot) XXX_DiscardUnknown() {
+ xxx_messageInfo_ResponseFinalizeSnapshot.DiscardUnknown(m)
}
-var xxx_messageInfo_ResponseFinalizeSnapshotSync proto.InternalMessageInfo
+var xxx_messageInfo_ResponseFinalizeSnapshot proto.InternalMessageInfo
type ResponsePrepareProposal struct {
// Possibly modified list of transactions that have been picked as part of the proposed block.
@@ -4449,7 +4449,7 @@ func init() {
proto.RegisterType((*RequestOfferSnapshot)(nil), "tendermint.abci.RequestOfferSnapshot")
proto.RegisterType((*RequestLoadSnapshotChunk)(nil), "tendermint.abci.RequestLoadSnapshotChunk")
proto.RegisterType((*RequestApplySnapshotChunk)(nil), "tendermint.abci.RequestApplySnapshotChunk")
- proto.RegisterType((*RequestFinalizeSnapshotSync)(nil), "tendermint.abci.RequestFinalizeSnapshotSync")
+ proto.RegisterType((*RequestFinalizeSnapshot)(nil), "tendermint.abci.RequestFinalizeSnapshot")
proto.RegisterType((*RequestPrepareProposal)(nil), "tendermint.abci.RequestPrepareProposal")
proto.RegisterType((*RequestProcessProposal)(nil), "tendermint.abci.RequestProcessProposal")
proto.RegisterType((*RequestExtendVote)(nil), "tendermint.abci.RequestExtendVote")
@@ -4467,7 +4467,7 @@ func init() {
proto.RegisterType((*ResponseOfferSnapshot)(nil), "tendermint.abci.ResponseOfferSnapshot")
proto.RegisterType((*ResponseLoadSnapshotChunk)(nil), "tendermint.abci.ResponseLoadSnapshotChunk")
proto.RegisterType((*ResponseApplySnapshotChunk)(nil), "tendermint.abci.ResponseApplySnapshotChunk")
- proto.RegisterType((*ResponseFinalizeSnapshotSync)(nil), "tendermint.abci.ResponseFinalizeSnapshotSync")
+ proto.RegisterType((*ResponseFinalizeSnapshot)(nil), "tendermint.abci.ResponseFinalizeSnapshot")
proto.RegisterType((*ResponsePrepareProposal)(nil), "tendermint.abci.ResponsePrepareProposal")
proto.RegisterType((*ResponseProcessProposal)(nil), "tendermint.abci.ResponseProcessProposal")
proto.RegisterType((*ExtendVoteExtension)(nil), "tendermint.abci.ExtendVoteExtension")
@@ -4494,245 +4494,245 @@ func init() {
func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) }
var fileDescriptor_252557cfdd89a31a = []byte{
- // 3807 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0xcb, 0x6f, 0x1b, 0x57,
- 0x77, 0xe7, 0xf0, 0xcd, 0xc3, 0xd7, 0xe8, 0x4a, 0xb6, 0x69, 0xda, 0x96, 0xf4, 0x8d, 0x9b, 0xd8,
- 0x71, 0x12, 0xc9, 0xb1, 0x9b, 0x38, 0x69, 0x92, 0x02, 0x14, 0x45, 0x97, 0x92, 0x65, 0x49, 0x19,
- 0x51, 0x0a, 0xd2, 0x34, 0x19, 0x8c, 0xc8, 0x2b, 0x71, 0x62, 0x92, 0x33, 0x99, 0x19, 0xca, 0x54,
- 0xb6, 0x6d, 0x81, 0x22, 0x8b, 0x22, 0xff, 0x40, 0x76, 0x2d, 0xd0, 0x4d, 0xf7, 0x5d, 0xb5, 0xcb,
- 0xa6, 0xe8, 0x26, 0xcb, 0x02, 0x45, 0xdd, 0xc0, 0xd9, 0xb5, 0xab, 0xac, 0xba, 0xe9, 0xa2, 0xb8,
- 0x8f, 0x79, 0x91, 0x33, 0x7c, 0xc4, 0x01, 0x8a, 0x6f, 0xc7, 0x7b, 0xee, 0x39, 0xe7, 0xbe, 0xce,
- 0x3d, 0xe7, 0xdc, 0xdf, 0x19, 0xc2, 0x0d, 0x1b, 0x0f, 0x3a, 0xd8, 0xec, 0x6b, 0x03, 0x7b, 0x53,
- 0x3d, 0x6d, 0x6b, 0x9b, 0xf6, 0xa5, 0x81, 0xad, 0x0d, 0xc3, 0xd4, 0x6d, 0x1d, 0x95, 0xbd, 0xce,
- 0x0d, 0xd2, 0x59, 0xbd, 0xe5, 0xe3, 0x6e, 0x9b, 0x97, 0x86, 0xad, 0x6f, 0x1a, 0xa6, 0xae, 0x9f,
- 0x31, 0xfe, 0xaa, 0x5f, 0x19, 0xd5, 0xb3, 0xd9, 0x51, 0xad, 0x2e, 0xef, 0xbc, 0x39, 0xd1, 0x79,
- 0xda, 0xd3, 0xdb, 0xcf, 0x22, 0x7b, 0x7d, 0x13, 0x09, 0xf4, 0xf2, 0x71, 0x9f, 0xe1, 0x4b, 0xa7,
- 0xf7, 0xd6, 0x84, 0xac, 0xa1, 0x9a, 0x6a, 0xdf, 0xe9, 0x5e, 0xf5, 0x75, 0x5f, 0x60, 0xd3, 0xd2,
- 0xf4, 0x41, 0x40, 0xf9, 0xda, 0xb9, 0xae, 0x9f, 0xf7, 0xf0, 0x26, 0x6d, 0x9d, 0x0e, 0xcf, 0x36,
- 0x6d, 0xad, 0x8f, 0x2d, 0x5b, 0xed, 0x1b, 0x9c, 0x61, 0xe5, 0x5c, 0x3f, 0xd7, 0xe9, 0xcf, 0x4d,
- 0xf2, 0x8b, 0x51, 0xa5, 0xff, 0xce, 0x41, 0x46, 0xc6, 0x5f, 0x0f, 0xb1, 0x65, 0xa3, 0x07, 0x90,
- 0xc4, 0xed, 0xae, 0x5e, 0x11, 0xd6, 0x85, 0xbb, 0xf9, 0x07, 0x37, 0x37, 0xc6, 0xf6, 0x6d, 0x83,
- 0xf3, 0x35, 0xda, 0x5d, 0xbd, 0x19, 0x93, 0x29, 0x2f, 0x7a, 0x17, 0x52, 0x67, 0xbd, 0xa1, 0xd5,
- 0xad, 0xc4, 0xa9, 0xd0, 0xad, 0x28, 0xa1, 0xc7, 0x84, 0xa9, 0x19, 0x93, 0x19, 0x37, 0x19, 0x4a,
- 0x1b, 0x9c, 0xe9, 0x95, 0xc4, 0xf4, 0xa1, 0x76, 0x06, 0x67, 0x74, 0x28, 0xc2, 0x8b, 0xb6, 0x00,
- 0xb4, 0x81, 0x66, 0x2b, 0xed, 0xae, 0xaa, 0x0d, 0x2a, 0x49, 0x2a, 0xf9, 0xbb, 0x68, 0x49, 0xcd,
- 0xae, 0x13, 0xc6, 0x66, 0x4c, 0xce, 0x69, 0x4e, 0x83, 0x4c, 0xf7, 0xeb, 0x21, 0x36, 0x2f, 0x2b,
- 0xa9, 0xe9, 0xd3, 0xfd, 0x84, 0x30, 0x91, 0xe9, 0x52, 0x6e, 0xf4, 0x11, 0x64, 0xdb, 0x5d, 0xdc,
- 0x7e, 0xa6, 0xd8, 0xa3, 0x4a, 0x86, 0x4a, 0xae, 0x45, 0x49, 0xd6, 0x09, 0x5f, 0x6b, 0xd4, 0x8c,
- 0xc9, 0x99, 0x36, 0xfb, 0x89, 0xf6, 0xa1, 0xd4, 0xd3, 0x2c, 0x5b, 0xb1, 0x06, 0xaa, 0x61, 0x75,
- 0x75, 0xdb, 0xaa, 0xe4, 0xa9, 0x8e, 0xd7, 0xa2, 0x74, 0xec, 0x69, 0x96, 0x7d, 0xe4, 0x30, 0x37,
- 0x63, 0x72, 0xb1, 0xe7, 0x27, 0x10, 0x7d, 0xfa, 0xd9, 0x19, 0x36, 0x5d, 0x85, 0x95, 0xc2, 0x74,
- 0x7d, 0x07, 0x84, 0xdb, 0x91, 0x27, 0xfa, 0x74, 0x3f, 0x01, 0x7d, 0x0e, 0xcb, 0x3d, 0x5d, 0xed,
- 0xb8, 0xea, 0x94, 0x76, 0x77, 0x38, 0x78, 0x56, 0x29, 0x52, 0xa5, 0x6f, 0x44, 0x4e, 0x52, 0x57,
- 0x3b, 0x8e, 0x8a, 0x3a, 0x11, 0x68, 0xc6, 0xe4, 0xa5, 0xde, 0x38, 0x11, 0x7d, 0x09, 0x2b, 0xaa,
- 0x61, 0xf4, 0x2e, 0xc7, 0xb5, 0x97, 0xa8, 0xf6, 0x7b, 0x51, 0xda, 0x6b, 0x44, 0x66, 0x5c, 0x3d,
- 0x52, 0x27, 0xa8, 0xa8, 0x03, 0x57, 0xcf, 0xb4, 0x81, 0xda, 0xd3, 0xbe, 0xc1, 0xde, 0x10, 0xd6,
- 0xe5, 0xa0, 0x5d, 0x59, 0xa1, 0x23, 0xbc, 0x15, 0x69, 0x91, 0x5c, 0xca, 0x51, 0x77, 0x74, 0x39,
- 0x68, 0x37, 0x63, 0xf2, 0xca, 0x59, 0x08, 0x1d, 0xb5, 0x40, 0x34, 0x4c, 0x6c, 0xa8, 0x26, 0x56,
- 0x0c, 0x53, 0x37, 0x74, 0x4b, 0xed, 0x55, 0xca, 0x54, 0xff, 0x9d, 0x28, 0xfd, 0x87, 0x8c, 0xff,
- 0x90, 0xb3, 0x37, 0x63, 0x72, 0xd9, 0x08, 0x92, 0x98, 0x56, 0xbd, 0x8d, 0x2d, 0xcb, 0xd3, 0x2a,
- 0xce, 0xd2, 0x4a, 0xf9, 0x83, 0x5a, 0x03, 0x24, 0xd4, 0x80, 0x3c, 0x1e, 0x11, 0x71, 0xe5, 0x42,
- 0xb7, 0x71, 0x65, 0x89, 0x2a, 0x94, 0x22, 0x6f, 0x33, 0x65, 0x3d, 0xd1, 0x6d, 0xdc, 0x8c, 0xc9,
- 0x80, 0xdd, 0x16, 0x52, 0xe1, 0xca, 0x05, 0x36, 0xb5, 0xb3, 0x4b, 0xaa, 0x46, 0xa1, 0x3d, 0xc4,
- 0xeb, 0x54, 0x10, 0x55, 0xf8, 0x66, 0x94, 0xc2, 0x13, 0x2a, 0x44, 0x54, 0x34, 0x1c, 0x91, 0x66,
- 0x4c, 0x5e, 0xbe, 0x98, 0x24, 0x13, 0x43, 0x76, 0xcf, 0x8e, 0xba, 0xd1, 0xca, 0xf2, 0x74, 0x43,
- 0x76, 0xce, 0x6c, 0x8b, 0x30, 0x13, 0x43, 0x3e, 0xf3, 0x13, 0xb6, 0x32, 0x90, 0xba, 0x50, 0x7b,
- 0x43, 0xbc, 0x9b, 0xcc, 0xa6, 0xc5, 0xcc, 0x6e, 0x32, 0x9b, 0x15, 0x73, 0xbb, 0xc9, 0x6c, 0x4e,
- 0x84, 0xdd, 0x64, 0x16, 0xc4, 0xbc, 0x74, 0x07, 0xf2, 0x3e, 0x27, 0x86, 0x2a, 0x90, 0xe9, 0x63,
- 0xcb, 0x52, 0xcf, 0x31, 0xf5, 0x79, 0x39, 0xd9, 0x69, 0x4a, 0x25, 0x28, 0xf8, 0x1d, 0x97, 0xf4,
- 0x9d, 0xe0, 0x4a, 0x12, 0x9f, 0x44, 0x24, 0xb9, 0x13, 0x76, 0x24, 0x79, 0x13, 0xdd, 0x86, 0x22,
- 0x5d, 0x8a, 0xe2, 0xf4, 0x13, 0xc7, 0x98, 0x94, 0x0b, 0x94, 0x78, 0xc2, 0x99, 0xd6, 0x20, 0x6f,
- 0x3c, 0x30, 0x5c, 0x96, 0x04, 0x65, 0x01, 0xe3, 0x81, 0xe1, 0x30, 0xfc, 0x0e, 0x0a, 0x64, 0xdd,
- 0x2e, 0x47, 0x92, 0x0e, 0x92, 0x27, 0x34, 0xce, 0x22, 0xfd, 0x45, 0x02, 0xc4, 0x71, 0x67, 0x87,
- 0xde, 0x87, 0x24, 0xf1, 0xfb, 0xdc, 0x85, 0x57, 0x37, 0x58, 0x50, 0xd8, 0x70, 0x82, 0xc2, 0x46,
- 0xcb, 0x09, 0x0a, 0x5b, 0xd9, 0x1f, 0x5e, 0xac, 0xc5, 0xbe, 0xfb, 0xcf, 0x35, 0x41, 0xa6, 0x12,
- 0xe8, 0x3a, 0x71, 0x71, 0xaa, 0x36, 0x50, 0xb4, 0x0e, 0x9d, 0x72, 0x8e, 0xf8, 0x2f, 0x55, 0x1b,
- 0xec, 0x74, 0xd0, 0x1e, 0x88, 0x6d, 0x7d, 0x60, 0xe1, 0x81, 0x35, 0xb4, 0x14, 0x16, 0x94, 0xb8,
- 0xe3, 0x0e, 0xb8, 0x5f, 0x16, 0x8d, 0xea, 0x0e, 0xe7, 0x21, 0x65, 0x94, 0xcb, 0xed, 0x20, 0x01,
- 0xed, 0x43, 0xf1, 0x42, 0xed, 0x69, 0x1d, 0xd5, 0xd6, 0x4d, 0xc5, 0xc2, 0x36, 0xf7, 0xe4, 0xb7,
- 0x27, 0xce, 0xfc, 0xc4, 0xe1, 0x3a, 0xc2, 0xf6, 0xb1, 0xd1, 0x51, 0x6d, 0xbc, 0x95, 0xfc, 0xe1,
- 0xc5, 0x9a, 0x20, 0x17, 0x2e, 0x7c, 0x3d, 0xe8, 0x75, 0x28, 0xab, 0x86, 0xa1, 0x58, 0xb6, 0x6a,
- 0x63, 0xe5, 0xf4, 0xd2, 0xc6, 0x16, 0x75, 0xee, 0x05, 0xb9, 0xa8, 0x1a, 0xc6, 0x11, 0xa1, 0x6e,
- 0x11, 0x22, 0x7a, 0x0d, 0x4a, 0x24, 0x0e, 0x68, 0x6a, 0x4f, 0xe9, 0x62, 0xed, 0xbc, 0x6b, 0x57,
- 0xd2, 0xeb, 0xc2, 0xdd, 0x84, 0x5c, 0xe4, 0xd4, 0x26, 0x25, 0xa2, 0x0d, 0x58, 0x76, 0xd8, 0xda,
- 0xba, 0x89, 0x1d, 0x5e, 0xe2, 0xf5, 0x8b, 0xf2, 0x12, 0xef, 0xaa, 0xeb, 0x26, 0x66, 0xfc, 0x52,
- 0xc7, 0xb5, 0x14, 0x1a, 0x33, 0x10, 0x82, 0x64, 0x47, 0xb5, 0x55, 0x7a, 0x02, 0x05, 0x99, 0xfe,
- 0x26, 0x34, 0x43, 0xb5, 0xbb, 0x7c, 0x5f, 0xe9, 0x6f, 0x74, 0x15, 0xd2, 0x5c, 0x75, 0x82, 0x4e,
- 0x83, 0xb7, 0xd0, 0x0a, 0xa4, 0x0c, 0x53, 0xbf, 0xc0, 0x74, 0x5b, 0xb2, 0x32, 0x6b, 0x48, 0x32,
- 0x94, 0x82, 0xf1, 0x05, 0x95, 0x20, 0x6e, 0x8f, 0xf8, 0x28, 0x71, 0x7b, 0x84, 0xee, 0x43, 0x92,
- 0x1c, 0x00, 0x1d, 0xa3, 0x14, 0x12, 0x51, 0xb9, 0x5c, 0xeb, 0xd2, 0xc0, 0x32, 0xe5, 0x94, 0xae,
- 0xc2, 0x4a, 0x58, 0xbc, 0x91, 0xba, 0x2e, 0x3d, 0x10, 0x37, 0xd0, 0xbb, 0x90, 0x75, 0x03, 0x0e,
- 0xb3, 0xaf, 0xeb, 0x13, 0xa3, 0x38, 0xcc, 0xb2, 0xcb, 0x4a, 0x0c, 0x8b, 0x9c, 0x4f, 0x57, 0xe5,
- 0x49, 0x42, 0x41, 0xce, 0xa8, 0x86, 0xd1, 0x54, 0xad, 0xae, 0x74, 0x0e, 0x95, 0xa8, 0x60, 0xe2,
- 0xdb, 0x1f, 0x81, 0xde, 0x0e, 0x67, 0x7f, 0x7c, 0x37, 0x2f, 0x4e, 0xcf, 0xc4, 0xbd, 0x79, 0xd4,
- 0x82, 0x87, 0x83, 0x67, 0xc4, 0x82, 0x13, 0x6c, 0x20, 0xda, 0xde, 0xe9, 0x48, 0x1d, 0xb8, 0x1e,
- 0x19, 0x57, 0x02, 0x72, 0x42, 0x40, 0x8e, 0x1c, 0x06, 0x8b, 0x56, 0x6c, 0xe2, 0xac, 0x41, 0xa6,
- 0x66, 0xd1, 0x75, 0xd3, 0x61, 0x72, 0x32, 0x6f, 0x49, 0x7f, 0x2d, 0xc0, 0x8d, 0x29, 0xc1, 0x05,
- 0x7d, 0x0c, 0xf9, 0x1e, 0x59, 0x03, 0xf7, 0x75, 0x21, 0x69, 0x16, 0xbb, 0x42, 0x7b, 0x84, 0x89,
- 0x7a, 0x34, 0x19, 0x7a, 0xee, 0x6f, 0x74, 0x1f, 0xd2, 0x6d, 0xbd, 0xdf, 0xd7, 0x6c, 0x9e, 0x6b,
- 0x55, 0xc2, 0x2e, 0x1f, 0xe9, 0x97, 0x39, 0x9f, 0xf4, 0x4b, 0x12, 0xae, 0x86, 0x47, 0x23, 0xb4,
- 0x0e, 0x85, 0xbe, 0x3a, 0x52, 0xec, 0x11, 0xbf, 0x32, 0x02, 0x35, 0x42, 0xe8, 0xab, 0xa3, 0xd6,
- 0x88, 0xdd, 0x17, 0x11, 0x12, 0xf6, 0xc8, 0xaa, 0xc4, 0xd7, 0x13, 0x77, 0x0b, 0x32, 0xf9, 0x89,
- 0x9e, 0xc2, 0x52, 0x4f, 0x6f, 0xab, 0x3d, 0xa5, 0xa7, 0x5a, 0xb6, 0xc2, 0xe7, 0xc2, 0x1c, 0xc1,
- 0x8d, 0x49, 0x7b, 0xa3, 0xdd, 0xc4, 0x59, 0xd2, 0x5b, 0x1b, 0x93, 0xcb, 0x54, 0x76, 0x4f, 0xb5,
- 0x6c, 0xd6, 0x85, 0xb6, 0x21, 0xdf, 0xd7, 0xac, 0x53, 0xdc, 0x55, 0x2f, 0x34, 0xdd, 0xac, 0x24,
- 0xd7, 0x13, 0xa1, 0xa9, 0xe0, 0x53, 0x8f, 0x87, 0x6b, 0xf2, 0x8b, 0xf9, 0xec, 0x24, 0x15, 0xb8,
- 0x47, 0x8e, 0x27, 0x4c, 0x2f, 0xec, 0x09, 0xef, 0xc3, 0xca, 0x00, 0x8f, 0x6c, 0xc5, 0xf5, 0x32,
- 0x16, 0x33, 0xde, 0x0c, 0xb5, 0x01, 0x44, 0xfa, 0x5c, 0xd7, 0x64, 0x11, 0x3b, 0x26, 0x66, 0x62,
- 0xea, 0xc3, 0x41, 0xa7, 0x92, 0x5d, 0x17, 0xee, 0xa6, 0x64, 0xd6, 0x40, 0x8f, 0xa0, 0x42, 0x3d,
- 0x08, 0x73, 0xab, 0xe4, 0x08, 0x71, 0xc7, 0x71, 0x27, 0x39, 0x6a, 0xba, 0x57, 0x48, 0x3f, 0x75,
- 0xdc, 0x7b, 0xb4, 0x97, 0xbb, 0xa0, 0x4d, 0x58, 0x61, 0xe9, 0x00, 0x36, 0x49, 0x5e, 0x40, 0x0e,
- 0x89, 0x4e, 0x00, 0xe8, 0x04, 0x96, 0x9c, 0xbe, 0x43, 0x53, 0x6f, 0x8d, 0xe8, 0xf8, 0xf7, 0x5d,
- 0x81, 0x8e, 0x42, 0xee, 0x9a, 0x73, 0x41, 0xf2, 0xf4, 0xe6, 0x20, 0xa7, 0xaf, 0x66, 0xb8, 0xf1,
- 0xe5, 0x91, 0x77, 0x8b, 0x0a, 0x93, 0x99, 0x30, 0xef, 0xf2, 0x7c, 0xb9, 0x77, 0xc9, 0xd6, 0x20,
- 0xff, 0xf5, 0x50, 0x37, 0x87, 0x7d, 0x36, 0xa5, 0x22, 0x9d, 0x12, 0x30, 0x12, 0xbd, 0xd3, 0xff,
- 0x94, 0xf2, 0xd9, 0x5c, 0x30, 0x31, 0xe1, 0x16, 0x25, 0x78, 0x16, 0x75, 0xe4, 0x9b, 0xb8, 0xdf,
- 0xa8, 0xe2, 0xf3, 0x1a, 0x95, 0xbb, 0xb6, 0x68, 0xbb, 0x4a, 0xfc, 0x3a, 0xbb, 0x42, 0x90, 0xa4,
- 0x2b, 0x4c, 0x32, 0x3f, 0x4e, 0x7e, 0x47, 0xda, 0x9a, 0x7b, 0xfe, 0x69, 0xff, 0xf9, 0x3b, 0x16,
- 0x98, 0xf9, 0xcd, 0x2c, 0x30, 0x1b, 0x69, 0x81, 0xbf, 0xda, 0xd6, 0x5a, 0x70, 0x75, 0x4c, 0x50,
- 0x19, 0xd2, 0x58, 0x4b, 0xad, 0x6d, 0xec, 0x9d, 0xe3, 0x38, 0x19, 0x9f, 0x22, 0x79, 0x39, 0xa0,
- 0x97, 0xc5, 0xe9, 0x48, 0x0b, 0xce, 0x2f, 0x6a, 0xc1, 0x85, 0x79, 0x2c, 0xb8, 0xf8, 0x2a, 0x16,
- 0x5c, 0x9a, 0xb0, 0xe0, 0x63, 0x58, 0x9a, 0xc8, 0x8d, 0x5d, 0x73, 0x10, 0x42, 0xcd, 0x21, 0x1e,
- 0x6e, 0x0e, 0x09, 0x9f, 0x39, 0x48, 0x3f, 0x09, 0x50, 0x8d, 0x4e, 0x91, 0x43, 0x07, 0x78, 0x07,
- 0xae, 0x78, 0xa9, 0x92, 0x7f, 0x1f, 0x59, 0x38, 0x42, 0x6e, 0xa7, 0xb7, 0x91, 0x53, 0xd2, 0x0a,
- 0x36, 0xa7, 0xa4, 0xdf, 0x44, 0x9f, 0x42, 0x39, 0x98, 0xdc, 0x93, 0xdc, 0x89, 0x5c, 0x97, 0x3f,
- 0x98, 0xb8, 0x2e, 0xde, 0x5e, 0xb8, 0x73, 0x96, 0x4b, 0x17, 0xfe, 0xa6, 0x25, 0xfd, 0x6b, 0xdc,
- 0x4d, 0x1d, 0x02, 0x99, 0x3a, 0xfa, 0xc0, 0x0d, 0x5d, 0xc2, 0xbc, 0x37, 0x9b, 0x0b, 0x8c, 0xdf,
- 0xe6, 0xf8, 0xab, 0xdd, 0xe6, 0x44, 0xe8, 0xf1, 0x25, 0xc3, 0xb7, 0x2a, 0xe5, 0xdf, 0xaa, 0xb7,
- 0x21, 0xc5, 0xc2, 0x36, 0x0b, 0x28, 0xd7, 0x26, 0xef, 0x05, 0x8b, 0xd8, 0x8c, 0x0b, 0xd5, 0x20,
- 0xcb, 0x9e, 0x01, 0x5a, 0x87, 0x3b, 0x80, 0xeb, 0x11, 0x12, 0x3b, 0xdb, 0x5b, 0xf9, 0x97, 0x2f,
- 0xd6, 0x32, 0xbc, 0x21, 0x67, 0xa8, 0xdc, 0x4e, 0x47, 0xfa, 0x3b, 0x80, 0xac, 0x8c, 0x2d, 0x83,
- 0x98, 0x30, 0xda, 0x82, 0x1c, 0x1e, 0xb5, 0xb1, 0x61, 0x3b, 0x4f, 0x8e, 0xf0, 0x27, 0x1d, 0xe3,
- 0x6e, 0x38, 0x9c, 0xcd, 0x98, 0xec, 0x89, 0xa1, 0x87, 0x1c, 0xdf, 0x89, 0x86, 0x6a, 0xb8, 0xb8,
- 0x1f, 0xe0, 0x79, 0xcf, 0x01, 0x78, 0x58, 0xa0, 0x5f, 0x8d, 0x94, 0x1a, 0x43, 0x78, 0x1e, 0x72,
- 0x84, 0x27, 0x39, 0x63, 0xb0, 0x00, 0xc4, 0x53, 0x0f, 0x40, 0x3c, 0xa9, 0x19, 0xcb, 0x8c, 0xc0,
- 0x78, 0xde, 0x73, 0x30, 0x9e, 0xf4, 0x8c, 0x19, 0x8f, 0x81, 0x3c, 0x1f, 0x4f, 0x80, 0x3c, 0xeb,
- 0x91, 0xa2, 0x21, 0x28, 0xcf, 0xc1, 0x04, 0xca, 0x93, 0xa5, 0x4a, 0x5e, 0x8f, 0x54, 0x32, 0x03,
- 0xe6, 0x39, 0x98, 0x80, 0x79, 0x72, 0x33, 0x14, 0xce, 0xc0, 0x79, 0xfe, 0x2c, 0x1c, 0xe7, 0x81,
- 0x48, 0x24, 0x86, 0x4f, 0x73, 0x3e, 0xa0, 0x47, 0x89, 0x00, 0x7a, 0xf2, 0x91, 0x70, 0x01, 0x53,
- 0x3f, 0x37, 0xd2, 0x83, 0x23, 0x91, 0x1e, 0x06, 0x71, 0xbc, 0x1d, 0x6d, 0x9a, 0x8b, 0x40, 0x3d,
- 0xc7, 0x21, 0x50, 0x0f, 0xcb, 0x91, 0xee, 0x46, 0x0e, 0x30, 0x07, 0xd6, 0x73, 0x1c, 0x82, 0xf5,
- 0x14, 0x67, 0xaa, 0x9d, 0x09, 0xf6, 0x3c, 0x0e, 0x82, 0x3d, 0xa5, 0x88, 0xb7, 0xb4, 0xe7, 0x19,
- 0x22, 0xd0, 0x9e, 0xd3, 0x28, 0xb4, 0xa7, 0x1c, 0x89, 0xa2, 0x31, 0x8d, 0x0b, 0xc0, 0x3d, 0x07,
- 0x13, 0x70, 0x8f, 0x38, 0xc3, 0xa0, 0xe7, 0xc4, 0x7b, 0xa4, 0x37, 0x48, 0xc8, 0x1e, 0xf3, 0x7d,
- 0xc4, 0x8f, 0x63, 0xd3, 0xd4, 0x4d, 0x8e, 0xd0, 0xb0, 0x86, 0x74, 0x97, 0xbc, 0xd7, 0x3d, 0x3f,
- 0x37, 0x05, 0x03, 0x2a, 0x43, 0x31, 0xe0, 0xdb, 0xa4, 0x7f, 0x10, 0x3c, 0x59, 0x8a, 0x02, 0xf9,
- 0xdf, 0xfa, 0x39, 0xfe, 0xd6, 0x1f, 0x7b, 0x9f, 0xe6, 0x02, 0x89, 0x87, 0x3f, 0xb5, 0xe1, 0xa0,
- 0x8f, 0xea, 0xa5, 0x34, 0xf7, 0x60, 0x89, 0x26, 0xc1, 0x2c, 0x70, 0x04, 0x62, 0x53, 0x99, 0x74,
- 0xb0, 0x5d, 0x60, 0x41, 0xea, 0x6d, 0x58, 0xf6, 0xf1, 0xba, 0x0f, 0x6c, 0x86, 0x7c, 0x88, 0x2e,
- 0x77, 0x8d, 0xbf, 0xb4, 0xff, 0x39, 0xe1, 0xed, 0x90, 0x87, 0x16, 0x85, 0x01, 0x3b, 0xc2, 0xaf,
- 0x06, 0x76, 0xa2, 0x1f, 0xfa, 0xe8, 0x73, 0x58, 0x09, 0x60, 0x3e, 0x4e, 0x8e, 0x99, 0x58, 0x0c,
- 0xfa, 0x89, 0xf9, 0x52, 0x1e, 0xb7, 0x07, 0x7d, 0x01, 0x37, 0x68, 0xb6, 0x1c, 0x91, 0xc7, 0x26,
- 0xe7, 0xcb, 0x63, 0xaf, 0x11, 0x1d, 0xf5, 0x90, 0x5c, 0x36, 0x02, 0x10, 0x4a, 0x45, 0x00, 0x42,
- 0x68, 0x0f, 0x0a, 0xe7, 0x78, 0x80, 0x2d, 0xcd, 0x52, 0x16, 0x78, 0x80, 0x0a, 0x24, 0xfd, 0x6f,
- 0xc6, 0xe4, 0x3c, 0x97, 0x25, 0xbd, 0x7f, 0x25, 0x08, 0x5b, 0x65, 0x28, 0x2a, 0x7e, 0x75, 0xd2,
- 0xff, 0x08, 0x9e, 0x59, 0xba, 0x88, 0x53, 0x5b, 0xef, 0x30, 0xf3, 0x2d, 0xca, 0xf4, 0x37, 0x79,
- 0x6a, 0xf5, 0xf4, 0x73, 0x6e, 0x81, 0xe4, 0x27, 0xe1, 0x72, 0x2b, 0x2e, 0x39, 0x1e, 0x6e, 0x57,
- 0x20, 0xa5, 0x0d, 0x3a, 0x78, 0xc4, 0x8d, 0x8c, 0x35, 0x88, 0xec, 0x33, 0x7c, 0xc9, 0x4d, 0x89,
- 0xfc, 0x24, 0x7c, 0xf4, 0x9e, 0xd1, 0xb5, 0x14, 0x64, 0xd6, 0x40, 0xef, 0x43, 0x8e, 0x96, 0xcd,
- 0x14, 0xdd, 0xb0, 0x78, 0xc0, 0x0c, 0xe4, 0x75, 0xac, 0xc4, 0xb5, 0x71, 0x48, 0x78, 0x0e, 0x0c,
- 0x4b, 0xce, 0x1a, 0xfc, 0x97, 0x2f, 0xf3, 0xca, 0x06, 0x32, 0xaf, 0x9b, 0x90, 0x23, 0xb3, 0xb7,
- 0x0c, 0xb5, 0x8d, 0x69, 0xb0, 0xcb, 0xc9, 0x1e, 0x41, 0xfa, 0x47, 0x01, 0xca, 0x63, 0xf1, 0x37,
- 0x74, 0xed, 0xce, 0xad, 0x8c, 0x07, 0x11, 0xb8, 0x89, 0xd5, 0xdf, 0x02, 0x38, 0x57, 0x2d, 0xe5,
- 0xb9, 0x3a, 0xb0, 0x71, 0x87, 0x6f, 0x41, 0xee, 0x5c, 0xb5, 0x3e, 0xa5, 0x84, 0xe0, 0x64, 0x52,
- 0x63, 0x93, 0xf1, 0x61, 0x40, 0x69, 0x3f, 0x06, 0x84, 0xaa, 0x90, 0x35, 0x4c, 0x4d, 0x37, 0x35,
- 0xfb, 0x92, 0xee, 0x49, 0x42, 0x76, 0xdb, 0xd2, 0x21, 0x5c, 0x09, 0x0d, 0xfd, 0xe8, 0x11, 0xe4,
- 0xbc, 0xac, 0x41, 0xa0, 0x19, 0xee, 0x14, 0x68, 0xcd, 0xe3, 0x25, 0x5b, 0x72, 0x25, 0x34, 0xf8,
- 0xa3, 0x06, 0xa4, 0x4d, 0x6c, 0x0d, 0x7b, 0x2c, 0xe3, 0x2e, 0x4d, 0x09, 0x8e, 0x01, 0x39, 0x42,
- 0x1d, 0xf6, 0x6c, 0x99, 0x0b, 0x4b, 0x5f, 0x42, 0x9a, 0x51, 0x50, 0x1e, 0x32, 0xc7, 0xfb, 0x4f,
- 0xf6, 0x0f, 0x3e, 0xdd, 0x17, 0x63, 0x08, 0x20, 0x5d, 0xab, 0xd7, 0x1b, 0x87, 0x2d, 0x51, 0x40,
- 0x39, 0x48, 0xd5, 0xb6, 0x0e, 0xe4, 0x96, 0x18, 0x27, 0x64, 0xb9, 0xb1, 0xdb, 0xa8, 0xb7, 0xc4,
- 0x04, 0x5a, 0x82, 0x22, 0xfb, 0xad, 0x3c, 0x3e, 0x90, 0x9f, 0xd6, 0x5a, 0x62, 0xd2, 0x47, 0x3a,
- 0x6a, 0xec, 0x6f, 0x37, 0x64, 0x31, 0x25, 0xbd, 0x03, 0xd7, 0x23, 0xd3, 0x0c, 0x0f, 0x7d, 0x13,
- 0x7c, 0xe8, 0x9b, 0xf4, 0x63, 0x9c, 0xbc, 0xa3, 0xa2, 0x72, 0x07, 0xb4, 0x3b, 0xb6, 0xf0, 0x07,
- 0x0b, 0x24, 0x1e, 0x63, 0xab, 0x47, 0xaf, 0x41, 0xc9, 0xc4, 0x67, 0xd8, 0x6e, 0x77, 0x59, 0x2e,
- 0xe3, 0xa0, 0x61, 0x45, 0x4e, 0xa5, 0x42, 0x16, 0x63, 0xfb, 0x0a, 0xb7, 0x6d, 0x85, 0x19, 0x81,
- 0x45, 0x31, 0x87, 0x1c, 0x61, 0x23, 0xd4, 0x23, 0x46, 0x24, 0xfe, 0x9f, 0xf9, 0x29, 0xa6, 0x2a,
- 0x49, 0x55, 0x01, 0x75, 0x3b, 0x94, 0x22, 0x3d, 0x5f, 0x68, 0xb3, 0x73, 0x90, 0x92, 0x1b, 0x2d,
- 0xf9, 0x33, 0x31, 0x81, 0x10, 0x94, 0xe8, 0x4f, 0xe5, 0x68, 0xbf, 0x76, 0x78, 0xd4, 0x3c, 0x20,
- 0x9b, 0xbd, 0x0c, 0x65, 0x67, 0xb3, 0x1d, 0x62, 0x0a, 0x5d, 0x81, 0xa5, 0xfa, 0xc1, 0xd3, 0xc3,
- 0xbd, 0x46, 0xab, 0xe1, 0x91, 0xd3, 0xd2, 0x2a, 0xdc, 0x9c, 0x96, 0x2a, 0x49, 0xff, 0x9e, 0x80,
- 0x6b, 0x11, 0xa9, 0x0e, 0x7a, 0x1f, 0xc0, 0x1e, 0x29, 0x26, 0x6e, 0xeb, 0x66, 0x27, 0xda, 0x78,
- 0x5b, 0x23, 0x99, 0x72, 0xc8, 0x39, 0x9b, 0xff, 0x9a, 0x1a, 0x2f, 0x3e, 0xe2, 0x4a, 0xc9, 0x66,
- 0x58, 0x1c, 0xc1, 0xb9, 0x15, 0xf2, 0x24, 0xc5, 0x6d, 0xa2, 0x98, 0x9e, 0x19, 0x55, 0x4c, 0xf9,
- 0xd1, 0x67, 0x70, 0x6d, 0x2c, 0xac, 0xf1, 0x58, 0x60, 0x85, 0x55, 0x8d, 0xc3, 0xa3, 0xdb, 0x95,
- 0x60, 0x74, 0x63, 0xb1, 0xc0, 0x9a, 0x02, 0x97, 0xa4, 0x5e, 0x01, 0x2e, 0x89, 0x0a, 0x8f, 0xe9,
- 0x45, 0x2b, 0x23, 0x61, 0xe1, 0x71, 0x2c, 0xed, 0xc8, 0x8c, 0xa7, 0x1d, 0xd2, 0xff, 0x06, 0x4e,
- 0x37, 0x98, 0x5e, 0x1e, 0x40, 0xda, 0xb2, 0x55, 0x7b, 0x68, 0xf1, 0xdb, 0xf4, 0x68, 0xde, 0x5c,
- 0x75, 0xc3, 0xf9, 0x71, 0x44, 0xc5, 0x65, 0xae, 0xe6, 0xf7, 0xf2, 0xd0, 0xa3, 0x8e, 0x27, 0xf5,
- 0x5b, 0x1c, 0x4f, 0x13, 0xd2, 0xf8, 0x02, 0x0f, 0x6c, 0xab, 0x92, 0xa6, 0x2b, 0xbe, 0x3a, 0xb9,
- 0x62, 0xd2, 0xbd, 0x55, 0x21, 0xf9, 0xcf, 0x7f, 0xbd, 0x58, 0x13, 0x19, 0xf7, 0x5b, 0x7a, 0x5f,
- 0xb3, 0x71, 0xdf, 0xb0, 0x2f, 0x65, 0x2e, 0x2f, 0xbd, 0x0b, 0xa5, 0xe0, 0xa6, 0x47, 0xbb, 0x11,
- 0xcf, 0x51, 0xc7, 0xa5, 0xbf, 0x17, 0x60, 0x39, 0x04, 0xdc, 0x41, 0x8f, 0x78, 0x41, 0x89, 0x1d,
- 0xfc, 0xed, 0xc9, 0xdd, 0x0b, 0xb0, 0x7b, 0x75, 0x25, 0x12, 0x38, 0xbd, 0xe7, 0x03, 0x3b, 0x63,
- 0x8f, 0x80, 0xde, 0x84, 0xb2, 0xa5, 0x9d, 0x0f, 0x14, 0x93, 0xe1, 0x44, 0x6e, 0xb1, 0x86, 0x64,
- 0xf7, 0xa4, 0xc3, 0x29, 0x69, 0x76, 0x48, 0xf6, 0x83, 0x40, 0x54, 0xc6, 0xb8, 0xa5, 0x36, 0xa0,
- 0xc9, 0xd7, 0x4c, 0x18, 0x92, 0x25, 0xbc, 0x02, 0x92, 0xf5, 0xb7, 0xb4, 0x94, 0x13, 0xf9, 0xc2,
- 0x41, 0x9f, 0x8c, 0xdd, 0x8b, 0x0f, 0x16, 0x79, 0x1f, 0x6d, 0x30, 0x5a, 0xf0, 0x66, 0x48, 0x0f,
- 0xa1, 0xe0, 0xa7, 0xcf, 0x77, 0x78, 0xbb, 0x5e, 0xfc, 0x0f, 0x22, 0x6e, 0xb7, 0xa1, 0x68, 0x62,
- 0x9b, 0x38, 0xa9, 0x00, 0x44, 0x59, 0x60, 0x44, 0x96, 0xaa, 0xee, 0x26, 0xb3, 0x82, 0x18, 0x77,
- 0xed, 0xe7, 0x5f, 0x04, 0x00, 0x0f, 0x86, 0xf3, 0x60, 0x30, 0xc1, 0x0f, 0x83, 0x8d, 0xa1, 0xa7,
- 0xf1, 0x71, 0xf4, 0x14, 0xdd, 0x81, 0x32, 0x7b, 0x93, 0x90, 0x73, 0x53, 0xed, 0xa1, 0x89, 0x39,
- 0xe8, 0x56, 0xa2, 0xe4, 0x23, 0x87, 0x8a, 0x3e, 0x87, 0xeb, 0x76, 0xd7, 0xc4, 0x56, 0x57, 0xef,
- 0x75, 0x94, 0xf1, 0xb3, 0x63, 0xc5, 0xa0, 0xb5, 0x19, 0x46, 0x27, 0x5f, 0x73, 0x35, 0x9c, 0x04,
- 0xcf, 0xef, 0x1b, 0x48, 0xd1, 0x6b, 0x43, 0x12, 0x3f, 0xd7, 0x8a, 0x73, 0xdc, 0x40, 0xbf, 0x00,
- 0x50, 0x6d, 0xdb, 0xd4, 0x4e, 0x87, 0xc4, 0x3b, 0xc4, 0x27, 0x87, 0xf2, 0xae, 0x5d, 0xcd, 0xe1,
- 0xdb, 0xba, 0xc9, 0xef, 0xdf, 0x8a, 0x27, 0xea, 0xbb, 0x83, 0x3e, 0x85, 0xd2, 0x3e, 0x94, 0x82,
- 0xb2, 0x4e, 0x46, 0xcd, 0xe6, 0x10, 0xcc, 0xa8, 0x59, 0x86, 0xce, 0x33, 0x6a, 0x37, 0x1f, 0x4f,
- 0xb0, 0xda, 0x2f, 0x6d, 0x48, 0xbf, 0x08, 0x50, 0xf0, 0x7b, 0xbd, 0xb9, 0x93, 0x5e, 0xfe, 0x08,
- 0x48, 0x4c, 0x3e, 0x02, 0x92, 0xbe, 0x34, 0xf8, 0x3a, 0x64, 0x49, 0x1a, 0x3c, 0xb4, 0x70, 0x87,
- 0x57, 0xc4, 0x33, 0xe7, 0xaa, 0x75, 0x6c, 0xe1, 0x8e, 0xcf, 0x37, 0x65, 0x5e, 0xcd, 0x37, 0x05,
- 0x93, 0xe9, 0xec, 0x58, 0x32, 0xbd, 0x9b, 0xcc, 0xa6, 0xc4, 0xb4, 0xec, 0xcb, 0xc6, 0xa5, 0xbf,
- 0x14, 0x20, 0xeb, 0xae, 0x37, 0x58, 0x0a, 0x0e, 0x00, 0xb5, 0x6c, 0xbb, 0x58, 0x21, 0x98, 0x3f,
- 0x5f, 0x58, 0x61, 0x3c, 0xe1, 0x16, 0xc6, 0x3f, 0x74, 0x13, 0xc2, 0x28, 0x28, 0xd2, 0xbf, 0xb9,
- 0x0e, 0xfa, 0xcc, 0xf3, 0xdf, 0xbf, 0xe1, 0xf3, 0x20, 0x19, 0x0b, 0xfa, 0x23, 0x48, 0xab, 0x6d,
- 0x17, 0x80, 0x2d, 0x85, 0x20, 0x93, 0x0e, 0xeb, 0x46, 0x6b, 0x54, 0xa3, 0x9c, 0x32, 0x97, 0xe0,
- 0xb3, 0x8a, 0x3b, 0xb3, 0x92, 0xf6, 0x88, 0x5e, 0xc6, 0x13, 0xbc, 0xe9, 0x25, 0x80, 0xe3, 0xfd,
- 0xa7, 0x07, 0xdb, 0x3b, 0x8f, 0x77, 0x1a, 0xdb, 0x3c, 0xe3, 0xdb, 0xde, 0x6e, 0x6c, 0x8b, 0x71,
- 0xc2, 0x27, 0x37, 0x9e, 0x1e, 0x9c, 0x34, 0xb6, 0xc5, 0x04, 0x69, 0x6c, 0x37, 0xf6, 0x6a, 0x9f,
- 0x35, 0xb6, 0xc5, 0xa4, 0x54, 0x83, 0x9c, 0x1b, 0x74, 0xe8, 0x17, 0x04, 0xfa, 0x73, 0x6c, 0xf2,
- 0xdd, 0x62, 0x0d, 0xb4, 0x0a, 0xf9, 0xc9, 0x0a, 0x02, 0x79, 0xc0, 0xb1, 0xc2, 0x01, 0x09, 0x03,
- 0x65, 0x57, 0x07, 0x8f, 0x4d, 0x1f, 0x42, 0xc6, 0x18, 0x9e, 0x2a, 0x8e, 0xed, 0x8e, 0xe1, 0xee,
- 0xce, 0xfb, 0x6e, 0x78, 0xda, 0xd3, 0xda, 0x4f, 0xf0, 0x25, 0x0f, 0x72, 0x69, 0x63, 0x78, 0xfa,
- 0x84, 0x99, 0x38, 0x9b, 0x46, 0x7c, 0xca, 0x34, 0x12, 0x63, 0xd3, 0x40, 0x77, 0xa0, 0x30, 0xd0,
- 0x3b, 0x58, 0x51, 0x3b, 0x1d, 0x13, 0x5b, 0x2c, 0x76, 0xe7, 0xb8, 0xe6, 0x3c, 0xe9, 0xa9, 0xb1,
- 0x0e, 0xe9, 0x27, 0x01, 0xd0, 0x64, 0xa0, 0x45, 0x47, 0xb0, 0xe4, 0xc5, 0x6a, 0x27, 0x01, 0x60,
- 0x91, 0x60, 0x3d, 0x3a, 0x50, 0x07, 0x30, 0x06, 0xf1, 0x22, 0x48, 0x26, 0x59, 0xdf, 0x8a, 0xe7,
- 0xaa, 0x0c, 0xba, 0x5e, 0xba, 0x29, 0xf1, 0x39, 0x37, 0x25, 0x26, 0x23, 0x57, 0xde, 0xed, 0x19,
- 0x77, 0xa5, 0x89, 0x89, 0x42, 0x94, 0x01, 0x95, 0xd6, 0x84, 0x18, 0x5f, 0x67, 0xd4, 0x94, 0x84,
- 0x57, 0x99, 0x92, 0xf4, 0x10, 0xc4, 0x4f, 0xdc, 0xf1, 0xbd, 0xfc, 0xd1, 0x3f, 0x4d, 0x61, 0x62,
- 0x9a, 0x17, 0x90, 0x25, 0xde, 0x97, 0x06, 0x8d, 0x3f, 0x86, 0x9c, 0xbb, 0x7b, 0xee, 0x47, 0x48,
- 0x91, 0xdb, 0xce, 0x67, 0xe2, 0x89, 0xa0, 0x7b, 0xb0, 0x44, 0xe2, 0x86, 0x53, 0x0e, 0x66, 0x28,
- 0x61, 0x9c, 0x7a, 0xc3, 0x32, 0xeb, 0xd8, 0x73, 0xa0, 0x2d, 0x12, 0xa3, 0x45, 0x16, 0xcb, 0x71,
- 0xe7, 0xff, 0x63, 0x02, 0xe4, 0xdd, 0x37, 0x06, 0x96, 0xb2, 0x33, 0x2c, 0x06, 0x92, 0x09, 0xe9,
- 0xcf, 0xe3, 0x90, 0xf7, 0x95, 0xa7, 0xd0, 0x1f, 0x06, 0x12, 0xab, 0xf5, 0x69, 0xa5, 0x2c, 0x5f,
- 0x56, 0x15, 0x58, 0x58, 0x7c, 0xf1, 0x85, 0x45, 0x15, 0x06, 0x9d, 0x2a, 0x75, 0x72, 0xe1, 0x2a,
- 0xf5, 0x5b, 0x80, 0x6c, 0xdd, 0x56, 0x7b, 0x24, 0x78, 0x6b, 0x83, 0x73, 0x85, 0xdd, 0x76, 0x56,
- 0x19, 0x17, 0x69, 0xcf, 0x09, 0xed, 0x38, 0x24, 0x74, 0xa9, 0x07, 0x59, 0x17, 0x9c, 0x58, 0xfc,
- 0xdb, 0x9e, 0xb0, 0x6a, 0x7c, 0x15, 0xb2, 0x7d, 0x6c, 0xab, 0x34, 0xec, 0x31, 0xb0, 0xca, 0x6d,
- 0xdf, 0xfb, 0x00, 0xf2, 0xbe, 0x0f, 0x9e, 0x48, 0x24, 0xdc, 0x6f, 0x7c, 0x2a, 0xc6, 0xaa, 0x99,
- 0x6f, 0xbf, 0x5f, 0x4f, 0xec, 0xe3, 0xe7, 0x64, 0x28, 0xb9, 0x51, 0x6f, 0x36, 0xea, 0x4f, 0x44,
- 0xa1, 0x9a, 0xff, 0xf6, 0xfb, 0xf5, 0x8c, 0x8c, 0x69, 0x25, 0xe7, 0xde, 0x13, 0x28, 0x8f, 0x9d,
- 0x40, 0xd0, 0x41, 0x23, 0x28, 0x6d, 0x1f, 0x1f, 0xee, 0xed, 0xd4, 0x6b, 0xad, 0x86, 0x72, 0x72,
- 0xd0, 0x6a, 0x88, 0x02, 0xba, 0x06, 0xcb, 0x7b, 0x3b, 0x7f, 0xd2, 0x6c, 0x29, 0xf5, 0xbd, 0x9d,
- 0xc6, 0x7e, 0x4b, 0xa9, 0xb5, 0x5a, 0xb5, 0xfa, 0x13, 0x31, 0xfe, 0xe0, 0x3f, 0x00, 0xca, 0xb5,
- 0xad, 0xfa, 0x4e, 0xcd, 0x30, 0x7a, 0x5a, 0x5b, 0xa5, 0xee, 0xbe, 0x0e, 0x49, 0x8a, 0x3c, 0x4f,
- 0xfd, 0xc0, 0xba, 0x3a, 0xbd, 0x3c, 0x87, 0x1e, 0x43, 0x8a, 0x82, 0xd2, 0x68, 0xfa, 0x17, 0xd7,
- 0xd5, 0x19, 0xf5, 0x3a, 0x32, 0x19, 0x7a, 0x6f, 0xa6, 0x7e, 0x82, 0x5d, 0x9d, 0x5e, 0xbe, 0x43,
- 0x7b, 0x90, 0x71, 0x00, 0xb9, 0x59, 0xdf, 0x45, 0x57, 0x67, 0xd6, 0xd4, 0xc8, 0xd2, 0x18, 0xb0,
- 0x39, 0xfd, 0xeb, 0xec, 0xea, 0x8c, 0xc2, 0x1e, 0x92, 0x21, 0xe7, 0x41, 0xdd, 0xb3, 0x3f, 0x14,
- 0xaf, 0xce, 0x51, 0x68, 0x44, 0x5f, 0x42, 0x31, 0x08, 0xdd, 0xcd, 0xf7, 0x0d, 0x77, 0x75, 0xce,
- 0x22, 0x20, 0xd1, 0x1f, 0xc4, 0xf1, 0xe6, 0xfb, 0xa6, 0xbb, 0x3a, 0x67, 0x4d, 0x10, 0x7d, 0x05,
- 0x4b, 0x93, 0x38, 0xdb, 0xfc, 0x9f, 0x78, 0x57, 0x17, 0xa8, 0x12, 0xa2, 0x3e, 0xa0, 0x10, 0x7c,
- 0x6e, 0x81, 0x2f, 0xbe, 0xab, 0x8b, 0x14, 0x0d, 0x51, 0x07, 0xca, 0xe3, 0xd8, 0xd4, 0xbc, 0xdf,
- 0x66, 0x57, 0xe7, 0xae, 0xec, 0xb1, 0x51, 0x82, 0x18, 0xc9, 0xbc, 0xdf, 0x6a, 0x57, 0xe7, 0x2e,
- 0xf4, 0xa1, 0x63, 0x00, 0xdf, 0xdb, 0x76, 0x8e, 0x6f, 0xb7, 0xab, 0xf3, 0x94, 0xfc, 0x90, 0x01,
- 0xcb, 0x61, 0x8f, 0xd9, 0x45, 0x3e, 0xe5, 0xae, 0x2e, 0x54, 0x09, 0x24, 0xf6, 0x1c, 0x7c, 0x97,
- 0xce, 0xf7, 0x69, 0x77, 0x75, 0xce, 0x92, 0xe0, 0xd6, 0xd6, 0x0f, 0x2f, 0x57, 0x85, 0x1f, 0x5f,
- 0xae, 0x0a, 0x3f, 0xbd, 0x5c, 0x15, 0xbe, 0xfb, 0x79, 0x35, 0xf6, 0xe3, 0xcf, 0xab, 0xb1, 0x7f,
- 0xfb, 0x79, 0x35, 0xf6, 0xa7, 0x77, 0xcf, 0x35, 0xbb, 0x3b, 0x3c, 0xdd, 0x68, 0xeb, 0x7d, 0xfa,
- 0xff, 0x1d, 0x43, 0xbd, 0xdc, 0x64, 0x3a, 0x49, 0xcb, 0xf7, 0x2f, 0xa1, 0xd3, 0x34, 0x8d, 0x75,
- 0x0f, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x8b, 0x24, 0x0e, 0x7f, 0x45, 0x34, 0x00, 0x00,
+ // 3797 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4d, 0x70, 0x1b, 0x57,
+ 0x72, 0xc6, 0xe0, 0x1f, 0x8d, 0xbf, 0xe1, 0x23, 0x25, 0x41, 0xb0, 0x45, 0x72, 0x47, 0xf1, 0x4a,
+ 0xab, 0xb5, 0x49, 0xad, 0x14, 0xaf, 0xec, 0xec, 0x6e, 0xaa, 0x40, 0x10, 0x0a, 0x48, 0x51, 0x24,
+ 0x3d, 0x04, 0xa9, 0x38, 0xce, 0x7a, 0x6a, 0x08, 0x3c, 0x12, 0xb3, 0x02, 0x30, 0xe3, 0x99, 0x01,
+ 0x05, 0xee, 0x35, 0x49, 0x55, 0xca, 0x27, 0xdf, 0x53, 0x7b, 0x4b, 0x8e, 0xb9, 0xe7, 0x94, 0x1c,
+ 0xe3, 0x54, 0x2e, 0x3e, 0xa6, 0x2a, 0x15, 0xc5, 0x25, 0xdf, 0x72, 0xdb, 0x53, 0x2e, 0x39, 0xa4,
+ 0xde, 0xcf, 0xfc, 0x62, 0x06, 0x3f, 0x96, 0xab, 0x52, 0xb9, 0xe1, 0xf5, 0xeb, 0xee, 0x79, 0x3f,
+ 0xfd, 0xba, 0xfb, 0x7d, 0xfd, 0x00, 0xef, 0xd8, 0x78, 0xd4, 0xc3, 0xe6, 0x50, 0x1b, 0xd9, 0xdb,
+ 0xea, 0x79, 0x57, 0xdb, 0xb6, 0xaf, 0x0d, 0x6c, 0x6d, 0x19, 0xa6, 0x6e, 0xeb, 0xa8, 0xea, 0x75,
+ 0x6e, 0x91, 0xce, 0xfa, 0x1d, 0x1f, 0x77, 0xd7, 0xbc, 0x36, 0x6c, 0x7d, 0xdb, 0x30, 0x75, 0xfd,
+ 0x82, 0xf1, 0xd7, 0xfd, 0xca, 0xa8, 0x9e, 0xed, 0x9e, 0x6a, 0xf5, 0x79, 0xe7, 0xbb, 0x53, 0x9d,
+ 0xe7, 0x03, 0xbd, 0xfb, 0x32, 0xb6, 0xd7, 0x37, 0x90, 0x40, 0x2f, 0xff, 0xee, 0x4b, 0x7c, 0xed,
+ 0xf4, 0xde, 0x99, 0x92, 0x35, 0x54, 0x53, 0x1d, 0x3a, 0xdd, 0xeb, 0xbe, 0xee, 0x2b, 0x6c, 0x5a,
+ 0x9a, 0x3e, 0x0a, 0x28, 0xdf, 0xb8, 0xd4, 0xf5, 0xcb, 0x01, 0xde, 0xa6, 0xad, 0xf3, 0xf1, 0xc5,
+ 0xb6, 0xad, 0x0d, 0xb1, 0x65, 0xab, 0x43, 0x83, 0x33, 0xac, 0x5d, 0xea, 0x97, 0x3a, 0xfd, 0xb9,
+ 0x4d, 0x7e, 0x31, 0xaa, 0xf4, 0xba, 0x00, 0x39, 0x19, 0x7f, 0x31, 0xc6, 0x96, 0x8d, 0x1e, 0x41,
+ 0x1a, 0x77, 0xfb, 0x7a, 0x4d, 0xd8, 0x14, 0xee, 0x17, 0x1f, 0xbd, 0xbb, 0x15, 0x5a, 0xb7, 0x2d,
+ 0xce, 0xd7, 0xea, 0xf6, 0xf5, 0x76, 0x42, 0xa6, 0xbc, 0xe8, 0x43, 0xc8, 0x5c, 0x0c, 0xc6, 0x56,
+ 0xbf, 0x96, 0xa4, 0x42, 0x77, 0xe2, 0x84, 0x9e, 0x12, 0xa6, 0x76, 0x42, 0x66, 0xdc, 0xe4, 0x53,
+ 0xda, 0xe8, 0x42, 0xaf, 0xa5, 0x66, 0x7f, 0x6a, 0x6f, 0x74, 0x41, 0x3f, 0x45, 0x78, 0xd1, 0x0e,
+ 0x80, 0x36, 0xd2, 0x6c, 0xa5, 0xdb, 0x57, 0xb5, 0x51, 0x2d, 0x4d, 0x25, 0x7f, 0x14, 0x2f, 0xa9,
+ 0xd9, 0x4d, 0xc2, 0xd8, 0x4e, 0xc8, 0x05, 0xcd, 0x69, 0x90, 0xe1, 0x7e, 0x31, 0xc6, 0xe6, 0x75,
+ 0x2d, 0x33, 0x7b, 0xb8, 0x9f, 0x10, 0x26, 0x32, 0x5c, 0xca, 0x8d, 0x7e, 0x09, 0xf9, 0x6e, 0x1f,
+ 0x77, 0x5f, 0x2a, 0xf6, 0xa4, 0x96, 0xa3, 0x92, 0x1b, 0x71, 0x92, 0x4d, 0xc2, 0xd7, 0x99, 0xb4,
+ 0x13, 0x72, 0xae, 0xcb, 0x7e, 0xa2, 0x43, 0xa8, 0x0c, 0x34, 0xcb, 0x56, 0xac, 0x91, 0x6a, 0x58,
+ 0x7d, 0xdd, 0xb6, 0x6a, 0x45, 0xaa, 0xe3, 0xbd, 0x38, 0x1d, 0x07, 0x9a, 0x65, 0x9f, 0x38, 0xcc,
+ 0xed, 0x84, 0x5c, 0x1e, 0xf8, 0x09, 0x44, 0x9f, 0x7e, 0x71, 0x81, 0x4d, 0x57, 0x61, 0xad, 0x34,
+ 0x5b, 0xdf, 0x11, 0xe1, 0x76, 0xe4, 0x89, 0x3e, 0xdd, 0x4f, 0x40, 0x9f, 0xc1, 0xea, 0x40, 0x57,
+ 0x7b, 0xae, 0x3a, 0xa5, 0xdb, 0x1f, 0x8f, 0x5e, 0xd6, 0xca, 0x54, 0xe9, 0x4f, 0x62, 0x07, 0xa9,
+ 0xab, 0x3d, 0x47, 0x45, 0x93, 0x08, 0xb4, 0x13, 0xf2, 0xca, 0x20, 0x4c, 0x44, 0x9f, 0xc3, 0x9a,
+ 0x6a, 0x18, 0x83, 0xeb, 0xb0, 0xf6, 0x0a, 0xd5, 0xfe, 0x20, 0x4e, 0x7b, 0x83, 0xc8, 0x84, 0xd5,
+ 0x23, 0x75, 0x8a, 0x8a, 0x5e, 0xc0, 0xca, 0x85, 0x36, 0x52, 0x07, 0xda, 0x6f, 0xb1, 0xb7, 0x1e,
+ 0x6b, 0x54, 0xf9, 0xfd, 0x58, 0x63, 0xe4, 0x02, 0xbe, 0x25, 0x11, 0x2f, 0x42, 0x34, 0xd4, 0x01,
+ 0xd1, 0x30, 0xb1, 0xa1, 0x9a, 0x58, 0x31, 0x4c, 0xdd, 0xd0, 0x2d, 0x75, 0x50, 0xab, 0x52, 0xbd,
+ 0xf7, 0xe2, 0xf4, 0x1e, 0x33, 0xfe, 0x63, 0xce, 0xde, 0x4e, 0xc8, 0x55, 0x23, 0x48, 0x62, 0x5a,
+ 0xf5, 0x2e, 0xb6, 0x2c, 0x4f, 0xab, 0x38, 0x4f, 0x2b, 0xe5, 0x0f, 0x6a, 0x0d, 0x90, 0x50, 0x0b,
+ 0x8a, 0x78, 0x42, 0xc4, 0x95, 0x2b, 0xdd, 0xc6, 0xb5, 0x15, 0xaa, 0x50, 0x8a, 0x3d, 0xc0, 0x94,
+ 0xf5, 0x4c, 0xb7, 0x71, 0x3b, 0x21, 0x03, 0x76, 0x5b, 0x48, 0x85, 0x1b, 0x57, 0xd8, 0xd4, 0x2e,
+ 0xae, 0xa9, 0x1a, 0x85, 0xf6, 0x10, 0x47, 0x53, 0x43, 0x54, 0xe1, 0x4f, 0xe3, 0x14, 0x9e, 0x51,
+ 0x21, 0xa2, 0xa2, 0xe5, 0x88, 0xb4, 0x13, 0xf2, 0xea, 0xd5, 0x34, 0x99, 0xd8, 0xae, 0xbb, 0x5d,
+ 0xd4, 0x73, 0xd6, 0x56, 0x67, 0xdb, 0xae, 0xb3, 0x57, 0x3b, 0x84, 0x99, 0xd8, 0xee, 0x85, 0x9f,
+ 0xb0, 0x93, 0x83, 0xcc, 0x95, 0x3a, 0x18, 0xe3, 0xfd, 0x74, 0x3e, 0x2b, 0xe6, 0xf6, 0xd3, 0xf9,
+ 0xbc, 0x58, 0xd8, 0x4f, 0xe7, 0x0b, 0x22, 0xec, 0xa7, 0xf3, 0x20, 0x16, 0xa5, 0x7b, 0x50, 0xf4,
+ 0xf9, 0x2d, 0x54, 0x83, 0xdc, 0x10, 0x5b, 0x96, 0x7a, 0x89, 0xa9, 0x9b, 0x2b, 0xc8, 0x4e, 0x53,
+ 0xaa, 0x40, 0xc9, 0xef, 0xab, 0xa4, 0xaf, 0x04, 0x57, 0x92, 0xb8, 0x21, 0x22, 0xc9, 0xfd, 0xae,
+ 0x23, 0xc9, 0x9b, 0xe8, 0x2e, 0x94, 0xe9, 0x54, 0x14, 0xa7, 0x9f, 0xf8, 0xc2, 0xb4, 0x5c, 0xa2,
+ 0xc4, 0x33, 0xce, 0xb4, 0x01, 0x45, 0xe3, 0x91, 0xe1, 0xb2, 0xa4, 0x28, 0x0b, 0x18, 0x8f, 0x0c,
+ 0x87, 0xe1, 0x47, 0x50, 0x22, 0xf3, 0x76, 0x39, 0xd2, 0xf4, 0x23, 0x45, 0x42, 0xe3, 0x2c, 0xd2,
+ 0x5f, 0xa6, 0x40, 0x0c, 0xfb, 0x37, 0xf4, 0x11, 0xa4, 0x89, 0xab, 0xe7, 0x5e, 0xbb, 0xbe, 0xc5,
+ 0xe2, 0xc0, 0x96, 0x13, 0x07, 0xb6, 0x3a, 0x4e, 0x1c, 0xd8, 0xc9, 0x7f, 0xfd, 0x7a, 0x23, 0xf1,
+ 0xd5, 0x7f, 0x6e, 0x08, 0x32, 0x95, 0x40, 0xb7, 0x89, 0x57, 0x53, 0xb5, 0x91, 0xa2, 0xf5, 0xe8,
+ 0x90, 0x0b, 0xc4, 0x65, 0xa9, 0xda, 0x68, 0xaf, 0x87, 0x0e, 0x40, 0xec, 0xea, 0x23, 0x0b, 0x8f,
+ 0xac, 0xb1, 0xa5, 0xb0, 0x38, 0xc4, 0x7d, 0x75, 0xc0, 0xe3, 0xb2, 0x00, 0xd4, 0x74, 0x38, 0x8f,
+ 0x29, 0xa3, 0x5c, 0xed, 0x06, 0x09, 0xe8, 0x10, 0xca, 0x57, 0xea, 0x40, 0xeb, 0xa9, 0xb6, 0x6e,
+ 0x2a, 0x16, 0xb6, 0xb9, 0xf3, 0xbe, 0x3b, 0xb5, 0xe7, 0x67, 0x0e, 0xd7, 0x09, 0xb6, 0x4f, 0x8d,
+ 0x9e, 0x6a, 0xe3, 0x9d, 0xf4, 0xd7, 0xaf, 0x37, 0x04, 0xb9, 0x74, 0xe5, 0xeb, 0x41, 0x3f, 0x86,
+ 0xaa, 0x6a, 0x18, 0x8a, 0x65, 0xab, 0x36, 0x56, 0xce, 0xaf, 0x6d, 0x6c, 0x51, 0x7f, 0x5e, 0x92,
+ 0xcb, 0xaa, 0x61, 0x9c, 0x10, 0xea, 0x0e, 0x21, 0xa2, 0xf7, 0xa0, 0x42, 0x5c, 0xbf, 0xa6, 0x0e,
+ 0x94, 0x3e, 0xd6, 0x2e, 0xfb, 0x76, 0x2d, 0xbb, 0x29, 0xdc, 0x4f, 0xc9, 0x65, 0x4e, 0x6d, 0x53,
+ 0x22, 0xda, 0x82, 0x55, 0x87, 0xad, 0xab, 0x9b, 0xd8, 0xe1, 0x25, 0x8e, 0xbe, 0x2c, 0xaf, 0xf0,
+ 0xae, 0xa6, 0x6e, 0x62, 0xc6, 0x2f, 0xf5, 0x5c, 0x4b, 0xa1, 0x61, 0x02, 0x21, 0x48, 0xf7, 0x54,
+ 0x5b, 0xa5, 0x3b, 0x50, 0x92, 0xe9, 0x6f, 0x42, 0x33, 0x54, 0xbb, 0xcf, 0xd7, 0x95, 0xfe, 0x46,
+ 0x37, 0x21, 0xcb, 0x55, 0xa7, 0xe8, 0x30, 0x78, 0x0b, 0xad, 0x41, 0xc6, 0x30, 0xf5, 0x2b, 0x4c,
+ 0x97, 0x25, 0x2f, 0xb3, 0x86, 0x24, 0x43, 0x25, 0x18, 0x52, 0x50, 0x05, 0x92, 0xf6, 0x84, 0x7f,
+ 0x25, 0x69, 0x4f, 0xd0, 0x43, 0x48, 0x93, 0x0d, 0xa0, 0xdf, 0xa8, 0x44, 0x04, 0x51, 0x2e, 0xd7,
+ 0xb9, 0x36, 0xb0, 0x4c, 0x39, 0xa5, 0x9b, 0xb0, 0x16, 0x15, 0x62, 0xa4, 0xbe, 0x4b, 0x0f, 0x84,
+ 0x0a, 0xf4, 0x21, 0xe4, 0x5d, 0x9f, 0xca, 0xec, 0xeb, 0xf6, 0xd4, 0x57, 0x1c, 0x66, 0xd9, 0x65,
+ 0x25, 0x86, 0x45, 0xf6, 0xa7, 0xaf, 0xf2, 0xbc, 0xa0, 0x24, 0xe7, 0x54, 0xc3, 0x68, 0xab, 0x56,
+ 0x5f, 0xba, 0x84, 0x5a, 0x5c, 0xfc, 0xf0, 0xad, 0x8f, 0x40, 0x4f, 0x87, 0xb3, 0x3e, 0xbe, 0x93,
+ 0x97, 0xa4, 0x7b, 0xe2, 0x9e, 0x3c, 0x6a, 0xc1, 0xe3, 0xd1, 0x4b, 0x62, 0xc1, 0x29, 0xf6, 0x21,
+ 0xda, 0xde, 0xeb, 0x49, 0x3d, 0xb8, 0x1d, 0x1b, 0x4a, 0x02, 0x72, 0x42, 0x40, 0x8e, 0x6c, 0x06,
+ 0x0b, 0x50, 0x6c, 0xe0, 0xac, 0x41, 0x86, 0x66, 0xd1, 0x79, 0xd3, 0xcf, 0x14, 0x64, 0xde, 0x92,
+ 0xbe, 0x14, 0xe0, 0x56, 0x4c, 0x50, 0x41, 0xbf, 0x82, 0xe2, 0x80, 0x8c, 0x9f, 0xfb, 0xb9, 0x88,
+ 0xac, 0x8a, 0x1d, 0x9f, 0x03, 0xc2, 0x44, 0xbd, 0x99, 0x0c, 0x03, 0xf7, 0x37, 0x7a, 0x08, 0xd9,
+ 0xae, 0x3e, 0x1c, 0x6a, 0x36, 0x4f, 0xad, 0x6a, 0x51, 0x07, 0x8f, 0xf4, 0xcb, 0x9c, 0x4f, 0xfa,
+ 0x7d, 0x1a, 0x6e, 0x46, 0x47, 0x22, 0xb4, 0x09, 0xa5, 0xa1, 0x3a, 0x51, 0xec, 0x09, 0x3f, 0x2e,
+ 0x02, 0x35, 0x40, 0x18, 0xaa, 0x93, 0xce, 0x84, 0x9d, 0x15, 0x11, 0x52, 0xf6, 0xc4, 0xaa, 0x25,
+ 0x37, 0x53, 0xf7, 0x4b, 0x32, 0xf9, 0x89, 0x9e, 0xc3, 0xca, 0x40, 0xef, 0xaa, 0x03, 0x65, 0xa0,
+ 0x5a, 0xb6, 0xc2, 0xc7, 0xc2, 0x9c, 0xc0, 0x3b, 0xd3, 0xb6, 0x46, 0xbb, 0x89, 0xa3, 0xa4, 0x27,
+ 0x36, 0x21, 0x57, 0xa9, 0xec, 0x81, 0x6a, 0xd9, 0xac, 0x0b, 0xed, 0x42, 0x71, 0xa8, 0x59, 0xe7,
+ 0xb8, 0xaf, 0x5e, 0x69, 0xba, 0x59, 0x4b, 0x6f, 0xa6, 0x22, 0x33, 0xbf, 0xe7, 0x1e, 0x0f, 0xd7,
+ 0xe4, 0x17, 0xf3, 0xd9, 0x48, 0x26, 0x70, 0x86, 0x1c, 0x2f, 0x98, 0x5d, 0xda, 0x0b, 0x3e, 0x84,
+ 0xb5, 0x11, 0x9e, 0xd8, 0x8a, 0xeb, 0x61, 0x2c, 0x66, 0xb8, 0x39, 0xba, 0xff, 0x88, 0xf4, 0xb9,
+ 0x6e, 0xc9, 0x22, 0x36, 0x4c, 0x4c, 0xc4, 0xd4, 0xc7, 0xa3, 0x5e, 0x2d, 0xbf, 0x29, 0xdc, 0xcf,
+ 0xc8, 0xac, 0x81, 0x9e, 0x40, 0x8d, 0x7a, 0x0f, 0xe6, 0x52, 0xc9, 0x16, 0xe2, 0x9e, 0xe3, 0x4a,
+ 0x0a, 0xd4, 0x6c, 0x6f, 0x90, 0x7e, 0xea, 0xb4, 0x0f, 0x68, 0x2f, 0x77, 0x3f, 0xdb, 0xb0, 0xc6,
+ 0x52, 0x01, 0x6c, 0x92, 0x9c, 0x80, 0x6c, 0x12, 0x1d, 0x00, 0xd0, 0x01, 0xac, 0x38, 0x7d, 0xc7,
+ 0xa6, 0xde, 0x99, 0xd0, 0xef, 0x3f, 0x74, 0x05, 0x7a, 0x0a, 0x39, 0x67, 0xce, 0xe1, 0x28, 0xd2,
+ 0x53, 0x83, 0x9c, 0xbe, 0x86, 0xe1, 0xc6, 0x96, 0x27, 0xde, 0x09, 0x2a, 0x4d, 0x27, 0xbe, 0xbc,
+ 0xcb, 0xf3, 0xe3, 0xde, 0x01, 0xdb, 0x80, 0xe2, 0x17, 0x63, 0xdd, 0x1c, 0x0f, 0xd9, 0x90, 0xca,
+ 0x74, 0x48, 0xc0, 0x48, 0xf4, 0x3c, 0xff, 0x53, 0xc6, 0x67, 0x73, 0xc1, 0xa4, 0x84, 0x5b, 0x94,
+ 0xe0, 0x59, 0xd4, 0x89, 0x6f, 0xe0, 0x7e, 0xa3, 0x4a, 0x2e, 0x6a, 0x54, 0xee, 0xdc, 0xe2, 0xed,
+ 0x2a, 0xf5, 0xfd, 0xec, 0x0a, 0x41, 0x9a, 0xce, 0x30, 0xcd, 0x7c, 0x38, 0xf9, 0x1d, 0x6b, 0x6b,
+ 0xee, 0xfe, 0x67, 0xfd, 0xfb, 0xef, 0x58, 0x60, 0xee, 0x07, 0xb3, 0xc0, 0x7c, 0xac, 0x05, 0x7e,
+ 0x6f, 0x5b, 0xeb, 0xc0, 0xcd, 0x90, 0xa0, 0x32, 0xa6, 0x71, 0x96, 0x5a, 0x5b, 0xe8, 0x5a, 0xe3,
+ 0x38, 0x19, 0x9f, 0x22, 0x79, 0x35, 0xa0, 0x97, 0xc5, 0xe8, 0x58, 0x0b, 0x2e, 0x2e, 0x6b, 0xc1,
+ 0xa5, 0x45, 0x2c, 0xb8, 0xfc, 0x36, 0x16, 0x5c, 0x99, 0xb2, 0xe0, 0x53, 0x58, 0x99, 0xca, 0x8b,
+ 0x5d, 0x73, 0x10, 0x22, 0xcd, 0x21, 0x19, 0x6d, 0x0e, 0x29, 0x9f, 0x39, 0x48, 0xdf, 0x0a, 0x50,
+ 0x8f, 0x4f, 0x8f, 0x23, 0x3f, 0xf0, 0x33, 0xb8, 0xe1, 0xa5, 0x49, 0xfe, 0x75, 0x64, 0xa1, 0x08,
+ 0xb9, 0x9d, 0xde, 0x42, 0xce, 0x48, 0x29, 0xd8, 0x98, 0xd2, 0x7e, 0x13, 0x7d, 0x0e, 0xd5, 0x60,
+ 0x62, 0x4f, 0xf2, 0x26, 0x72, 0x5c, 0xfe, 0x60, 0xea, 0xb8, 0x78, 0x6b, 0xe1, 0x8e, 0x59, 0xae,
+ 0x5c, 0xf9, 0x9b, 0x96, 0xf4, 0xaf, 0x49, 0x37, 0x6d, 0x08, 0x64, 0xe9, 0xe8, 0x63, 0x37, 0x74,
+ 0x09, 0x8b, 0x9e, 0x6c, 0x2e, 0x10, 0x3e, 0xcd, 0xc9, 0xb7, 0x3b, 0xcd, 0xa9, 0xc8, 0xed, 0x4b,
+ 0x47, 0x2f, 0x55, 0xc6, 0xbf, 0x54, 0x1f, 0x40, 0x86, 0x85, 0x6d, 0x16, 0x50, 0x6e, 0x4d, 0x9f,
+ 0x0b, 0x16, 0xb1, 0x19, 0x17, 0x6a, 0x40, 0x9e, 0x5d, 0x01, 0xb4, 0x1e, 0x77, 0x00, 0xb7, 0x63,
+ 0x24, 0xf6, 0x76, 0x77, 0x8a, 0x6f, 0x5e, 0x6f, 0xe4, 0x78, 0x43, 0xce, 0x51, 0xb9, 0xbd, 0x9e,
+ 0xf4, 0x37, 0x00, 0x79, 0x19, 0x5b, 0x06, 0x31, 0x61, 0xb4, 0x03, 0x05, 0x3c, 0xe9, 0x62, 0xc3,
+ 0x76, 0xae, 0x1b, 0xd1, 0xd7, 0x39, 0xc6, 0xdd, 0x72, 0x38, 0xdb, 0x09, 0xd9, 0x13, 0x43, 0x8f,
+ 0x39, 0x9c, 0x13, 0x8f, 0xcc, 0x70, 0x71, 0x3f, 0x9e, 0xf3, 0x73, 0x07, 0xcf, 0x61, 0x81, 0x7e,
+ 0x3d, 0x56, 0x2a, 0x04, 0xe8, 0x3c, 0xe6, 0x80, 0x4e, 0x7a, 0xce, 0xc7, 0x02, 0x88, 0x4e, 0x33,
+ 0x80, 0xe8, 0x64, 0xe6, 0x4c, 0x33, 0x06, 0xd2, 0xf9, 0xb9, 0x03, 0xe9, 0x64, 0xe7, 0x8c, 0x38,
+ 0x84, 0xe9, 0xfc, 0x6a, 0x0a, 0xd3, 0xd9, 0x8c, 0x15, 0x8d, 0x00, 0x75, 0x8e, 0xa6, 0x40, 0x9d,
+ 0x3c, 0x55, 0xf2, 0xe3, 0x58, 0x25, 0x73, 0x50, 0x9d, 0xa3, 0x29, 0x54, 0xa7, 0x30, 0x47, 0xe1,
+ 0x1c, 0x58, 0xe7, 0xcf, 0xa3, 0x61, 0x1d, 0x88, 0x05, 0x5e, 0xf8, 0x30, 0x17, 0xc3, 0x75, 0x94,
+ 0x18, 0x5c, 0xa7, 0x18, 0x0b, 0x15, 0x30, 0xf5, 0x0b, 0x03, 0x3b, 0x7f, 0x1a, 0x05, 0xec, 0xac,
+ 0xc4, 0x62, 0x52, 0xdc, 0x2a, 0x17, 0x41, 0x76, 0x4e, 0x23, 0x90, 0x9d, 0x52, 0x2c, 0x62, 0xc4,
+ 0x14, 0x2f, 0x00, 0xed, 0x9c, 0x46, 0x40, 0x3b, 0xe5, 0xb9, 0x6a, 0xe7, 0x62, 0x3b, 0x4f, 0x83,
+ 0xd8, 0x4e, 0x25, 0xe6, 0xea, 0xec, 0x39, 0x83, 0x18, 0x70, 0xe7, 0x3c, 0x0e, 0xdc, 0x61, 0xa0,
+ 0xd6, 0xfb, 0xb1, 0x1a, 0x97, 0x40, 0x77, 0x8e, 0xa6, 0xd0, 0x1d, 0x71, 0x8e, 0x0d, 0x2f, 0x08,
+ 0xef, 0x48, 0x3f, 0x21, 0x51, 0x3a, 0xe4, 0xee, 0x88, 0xeb, 0xc6, 0xa6, 0xa9, 0x9b, 0x1c, 0x90,
+ 0x61, 0x0d, 0xe9, 0x3e, 0xb9, 0x9e, 0x7b, 0xae, 0x6d, 0x06, 0xe4, 0x53, 0x85, 0x72, 0xc0, 0x9d,
+ 0x49, 0xff, 0x20, 0x78, 0xb2, 0x14, 0xf4, 0xf1, 0x5f, 0xed, 0x0b, 0xfc, 0x6a, 0x1f, 0xba, 0x8e,
+ 0x16, 0x02, 0xb9, 0x86, 0x3f, 0x9b, 0xe1, 0x18, 0x8f, 0xea, 0x65, 0x31, 0x0f, 0x60, 0x85, 0xe6,
+ 0xbd, 0x2c, 0x56, 0x04, 0xc2, 0x51, 0x95, 0x74, 0xb0, 0x55, 0x60, 0x71, 0xe9, 0x03, 0x58, 0xf5,
+ 0xf1, 0xba, 0xf7, 0x69, 0x06, 0x74, 0x88, 0x2e, 0x77, 0x83, 0x5f, 0xac, 0xff, 0x39, 0xe5, 0xad,
+ 0x90, 0x07, 0x0e, 0x45, 0xe1, 0x38, 0xc2, 0xf7, 0xc6, 0x71, 0xe2, 0xef, 0xf5, 0xe8, 0x33, 0x58,
+ 0x0b, 0x40, 0x3c, 0x4e, 0x5a, 0x99, 0x5a, 0x0e, 0xe9, 0x49, 0xf8, 0xb2, 0x1c, 0xb7, 0x07, 0xfd,
+ 0x1a, 0xde, 0xa1, 0x09, 0x72, 0x4c, 0xea, 0x9a, 0x5e, 0x2c, 0x75, 0xbd, 0x45, 0x74, 0x34, 0x23,
+ 0xd2, 0xd7, 0x18, 0xfc, 0x27, 0x13, 0x83, 0xff, 0xa0, 0x03, 0x28, 0x5d, 0xe2, 0x11, 0xb6, 0x34,
+ 0x4b, 0x59, 0xe2, 0xce, 0x29, 0x90, 0x8c, 0xbf, 0x9d, 0x90, 0x8b, 0x5c, 0x96, 0xf4, 0xfe, 0xb5,
+ 0x20, 0xec, 0x54, 0xa1, 0xac, 0xf8, 0xd5, 0x49, 0xff, 0x2d, 0x78, 0x66, 0xe9, 0x02, 0x4c, 0x5d,
+ 0xbd, 0xc7, 0xcc, 0xb7, 0x2c, 0xd3, 0xdf, 0xe4, 0x76, 0x35, 0xd0, 0x2f, 0xb9, 0x05, 0x92, 0x9f,
+ 0x84, 0xcb, 0xad, 0xa9, 0x14, 0x78, 0x84, 0x5d, 0x83, 0x8c, 0x36, 0xea, 0xe1, 0x09, 0x37, 0x32,
+ 0xd6, 0x20, 0xb2, 0x2f, 0xf1, 0x35, 0x37, 0x25, 0xf2, 0x93, 0xf0, 0xd1, 0x73, 0x46, 0xe7, 0x52,
+ 0x92, 0x59, 0x03, 0x7d, 0x04, 0x05, 0x5a, 0x18, 0x53, 0x74, 0xc3, 0xe2, 0x31, 0x32, 0x90, 0xca,
+ 0xb1, 0x22, 0xd6, 0xd6, 0x31, 0xe1, 0x39, 0x32, 0x2c, 0x39, 0x6f, 0xf0, 0x5f, 0xbe, 0x64, 0x2b,
+ 0x1f, 0x48, 0xb6, 0xde, 0x85, 0x02, 0x19, 0xbd, 0x65, 0xa8, 0x5d, 0x4c, 0xe3, 0x5b, 0x41, 0xf6,
+ 0x08, 0xd2, 0x3f, 0x0a, 0x50, 0x0d, 0x85, 0xdc, 0xc8, 0xb9, 0x3b, 0xa7, 0x32, 0x19, 0x04, 0xdc,
+ 0xa6, 0x66, 0x7f, 0x07, 0xe0, 0x52, 0xb5, 0x94, 0x57, 0xea, 0xc8, 0xc6, 0x3d, 0xbe, 0x04, 0x85,
+ 0x4b, 0xd5, 0x7a, 0x41, 0x09, 0xc1, 0xc1, 0x64, 0x42, 0x83, 0xf1, 0x41, 0x3e, 0x59, 0x3f, 0xe4,
+ 0x83, 0xea, 0x90, 0x37, 0x4c, 0x4d, 0x37, 0x35, 0xfb, 0x9a, 0xae, 0x49, 0x4a, 0x76, 0xdb, 0xd2,
+ 0x31, 0xdc, 0x88, 0x8c, 0xf6, 0xe8, 0x09, 0x14, 0xbc, 0x44, 0x41, 0xa0, 0x49, 0xed, 0x0c, 0x24,
+ 0xcd, 0xe3, 0x25, 0x4b, 0x72, 0x23, 0x32, 0xde, 0xa3, 0x16, 0x64, 0x4d, 0x6c, 0x8d, 0x07, 0x2c,
+ 0xc9, 0xae, 0x3c, 0xfa, 0x60, 0xb1, 0x3c, 0x81, 0x50, 0xc7, 0x03, 0x5b, 0xe6, 0xc2, 0xd2, 0xe7,
+ 0x90, 0x65, 0x14, 0x54, 0x84, 0xdc, 0xe9, 0xe1, 0xb3, 0xc3, 0xa3, 0x17, 0x87, 0x62, 0x02, 0x01,
+ 0x64, 0x1b, 0xcd, 0x66, 0xeb, 0xb8, 0x23, 0x0a, 0xa8, 0x00, 0x99, 0xc6, 0xce, 0x91, 0xdc, 0x11,
+ 0x93, 0x84, 0x2c, 0xb7, 0xf6, 0x5b, 0xcd, 0x8e, 0x98, 0x42, 0x2b, 0x50, 0x66, 0xbf, 0x95, 0xa7,
+ 0x47, 0xf2, 0xf3, 0x46, 0x47, 0x4c, 0xfb, 0x48, 0x27, 0xad, 0xc3, 0xdd, 0x96, 0x2c, 0x66, 0xa4,
+ 0x9f, 0xc1, 0xed, 0xd8, 0xcc, 0xc2, 0x03, 0xdb, 0x04, 0x1f, 0xd8, 0x26, 0x7d, 0x93, 0x24, 0x57,
+ 0xa7, 0xb8, 0x74, 0x01, 0xed, 0x87, 0x26, 0xfe, 0x68, 0x89, 0x5c, 0x23, 0x34, 0x7b, 0xf4, 0x1e,
+ 0x54, 0x4c, 0x7c, 0x81, 0xed, 0x6e, 0x9f, 0xa5, 0x2f, 0x0e, 0x00, 0x56, 0xe6, 0x54, 0x2a, 0x64,
+ 0x31, 0xb6, 0xdf, 0xe0, 0xae, 0xad, 0x30, 0x23, 0xb0, 0x28, 0xcc, 0x50, 0x20, 0x6c, 0x84, 0x7a,
+ 0xc2, 0x88, 0xc4, 0xff, 0x33, 0x3f, 0xc5, 0x54, 0xa5, 0xa9, 0x2a, 0xa0, 0x6e, 0x87, 0x52, 0xa4,
+ 0x57, 0x4b, 0x2d, 0x76, 0x01, 0x32, 0x72, 0xab, 0x23, 0x7f, 0x2a, 0xa6, 0x10, 0x82, 0x0a, 0xfd,
+ 0xa9, 0x9c, 0x1c, 0x36, 0x8e, 0x4f, 0xda, 0x47, 0x64, 0xb1, 0x57, 0xa1, 0xea, 0x2c, 0xb6, 0x43,
+ 0xcc, 0xa0, 0x1b, 0xb0, 0xd2, 0x3c, 0x7a, 0x7e, 0x7c, 0xd0, 0xea, 0xb4, 0x3c, 0x72, 0x56, 0xaa,
+ 0x43, 0x2d, 0x2e, 0x45, 0x92, 0xfe, 0x3d, 0x05, 0xb7, 0x62, 0xd2, 0x1c, 0xf4, 0x11, 0x80, 0x3d,
+ 0x51, 0x4c, 0xdc, 0xd5, 0xcd, 0x5e, 0xbc, 0xe1, 0x76, 0x26, 0x32, 0xe5, 0x90, 0x0b, 0x36, 0xff,
+ 0x35, 0x33, 0x56, 0xfc, 0x92, 0x2b, 0x25, 0x0b, 0x61, 0x71, 0xc0, 0xe6, 0x4e, 0xc4, 0x0d, 0x14,
+ 0x77, 0x89, 0x62, 0xba, 0x5f, 0x54, 0x31, 0xe5, 0x47, 0x9f, 0xc2, 0xad, 0x50, 0x48, 0xe3, 0x71,
+ 0xc0, 0x8a, 0xaa, 0x09, 0x47, 0x47, 0xb6, 0x1b, 0xc1, 0xc8, 0xc6, 0xe2, 0x80, 0x35, 0x03, 0x1d,
+ 0xc9, 0xbc, 0x05, 0x3a, 0x12, 0x17, 0x1a, 0xb3, 0xcb, 0x16, 0x41, 0xa2, 0x42, 0x63, 0x28, 0xe5,
+ 0xc8, 0x85, 0x53, 0x0e, 0xe9, 0x7f, 0x02, 0xbb, 0x1b, 0x4c, 0x2d, 0x8f, 0x20, 0x6b, 0xd9, 0xaa,
+ 0x3d, 0xb6, 0xf8, 0x49, 0x7a, 0xb2, 0x68, 0x9e, 0xba, 0xe5, 0xfc, 0x38, 0xa1, 0xe2, 0x32, 0x57,
+ 0xf3, 0xff, 0x72, 0xd3, 0xe3, 0xb6, 0x27, 0xf3, 0x43, 0x6c, 0x4f, 0x1b, 0xb2, 0xf8, 0x0a, 0x8f,
+ 0x6c, 0xab, 0x96, 0xa5, 0x33, 0xbe, 0x39, 0x3d, 0x63, 0xd2, 0xbd, 0x53, 0x23, 0xb9, 0xcf, 0x7f,
+ 0xbd, 0xde, 0x10, 0x19, 0xf7, 0xfb, 0xfa, 0x50, 0xb3, 0xf1, 0xd0, 0xb0, 0xaf, 0x65, 0x2e, 0x2f,
+ 0x7d, 0x08, 0x95, 0xe0, 0xa2, 0xc7, 0xbb, 0x10, 0xcf, 0x49, 0x27, 0xa5, 0xbf, 0x17, 0x60, 0x35,
+ 0x02, 0xcb, 0x41, 0x4f, 0x78, 0xed, 0x88, 0x6d, 0xfc, 0xdd, 0xe9, 0xd5, 0x0b, 0xb0, 0x7b, 0x25,
+ 0x24, 0x12, 0x34, 0xbd, 0xab, 0x03, 0xdb, 0x63, 0x8f, 0x80, 0x7e, 0x0a, 0x55, 0x4b, 0xbb, 0x1c,
+ 0x29, 0x26, 0x83, 0x85, 0xdc, 0xba, 0x0c, 0xc9, 0xec, 0x49, 0x87, 0x53, 0xbd, 0xec, 0x91, 0xcc,
+ 0x07, 0x81, 0xa8, 0x84, 0xb8, 0xa5, 0x2e, 0xa0, 0xe9, 0x9b, 0x4c, 0x14, 0x70, 0x25, 0xbc, 0x05,
+ 0x70, 0xf5, 0x77, 0x02, 0xbc, 0x33, 0xe3, 0x76, 0x83, 0x3e, 0x09, 0x9d, 0x8b, 0x8f, 0x97, 0xb9,
+ 0x1b, 0x6d, 0x31, 0x5a, 0xf0, 0x64, 0x48, 0x8f, 0xa1, 0xe4, 0xa7, 0x2f, 0xb6, 0x79, 0xfb, 0x5e,
+ 0xec, 0x0f, 0x02, 0x6c, 0x77, 0xa1, 0x6c, 0x62, 0x9b, 0x38, 0xa9, 0x00, 0x22, 0x59, 0x62, 0x44,
+ 0x96, 0xa6, 0xee, 0xa7, 0xf3, 0x82, 0x98, 0x74, 0xed, 0xe7, 0x5f, 0x04, 0x00, 0x0f, 0x75, 0xf3,
+ 0x50, 0x2f, 0xc1, 0x8f, 0x7a, 0x85, 0xc0, 0xd2, 0x64, 0x18, 0x2c, 0x45, 0xf7, 0xa0, 0xca, 0xee,
+ 0x23, 0x64, 0xdf, 0x54, 0x7b, 0x6c, 0x62, 0x8e, 0xb1, 0x55, 0x28, 0xf9, 0xc4, 0xa1, 0xa2, 0xcf,
+ 0xe0, 0xb6, 0xdd, 0x37, 0xb1, 0xd5, 0xd7, 0x07, 0x3d, 0x25, 0xbc, 0x77, 0xac, 0xf6, 0xb3, 0x31,
+ 0xc7, 0xe8, 0xe4, 0x5b, 0xae, 0x86, 0xb3, 0xe0, 0xfe, 0xfd, 0x16, 0x32, 0xf4, 0xd8, 0x90, 0xa4,
+ 0xcf, 0xb5, 0xe2, 0x02, 0x37, 0xd0, 0x5f, 0x03, 0xa8, 0xb6, 0x6d, 0x6a, 0xe7, 0x63, 0xe2, 0x1d,
+ 0x92, 0xd3, 0x9f, 0xf2, 0x8e, 0x5d, 0xc3, 0xe1, 0xdb, 0x79, 0x97, 0x9f, 0xbf, 0x35, 0x4f, 0xd4,
+ 0x77, 0x06, 0x7d, 0x0a, 0xa5, 0x43, 0xa8, 0x04, 0x65, 0x9d, 0x6c, 0x9a, 0x8d, 0x21, 0x98, 0x4d,
+ 0xb3, 0xec, 0x9c, 0x67, 0xd3, 0x6e, 0x2e, 0x9e, 0x62, 0x65, 0x5e, 0xda, 0x90, 0x7e, 0x2f, 0x40,
+ 0xc9, 0xef, 0xf5, 0x16, 0x4e, 0x78, 0xf9, 0x05, 0x20, 0x35, 0x7d, 0x01, 0x48, 0xfb, 0x52, 0xe0,
+ 0xdb, 0x90, 0x27, 0x29, 0xf0, 0xd8, 0xc2, 0x3d, 0x5e, 0xfc, 0xce, 0x5d, 0xaa, 0xd6, 0xa9, 0x85,
+ 0x7b, 0x3e, 0xdf, 0x94, 0x7b, 0x3b, 0xdf, 0x14, 0x4c, 0xa4, 0xf3, 0xa1, 0x44, 0x7a, 0x3f, 0x9d,
+ 0xcf, 0x88, 0x59, 0xd9, 0x97, 0x89, 0x4b, 0x7f, 0x25, 0x40, 0xde, 0x9d, 0x6f, 0xb0, 0xea, 0x1b,
+ 0xc0, 0x65, 0xd9, 0x72, 0xb1, 0x9a, 0x2f, 0xbf, 0xba, 0xb0, 0x1a, 0x78, 0xca, 0xad, 0x81, 0xff,
+ 0xc2, 0x4d, 0x06, 0xe3, 0x90, 0x47, 0xff, 0xe2, 0x3a, 0x60, 0x33, 0xcf, 0x7d, 0xff, 0x96, 0x8f,
+ 0x83, 0x64, 0x2c, 0xe8, 0x8f, 0x20, 0xab, 0x76, 0x5d, 0xbc, 0xb5, 0x12, 0x01, 0x44, 0x3a, 0xac,
+ 0x5b, 0x9d, 0x49, 0x83, 0x72, 0xca, 0x5c, 0x82, 0x8f, 0x2a, 0xe9, 0x8c, 0x4a, 0x3a, 0x20, 0x7a,
+ 0x19, 0x4f, 0xf0, 0xa4, 0x57, 0x00, 0x4e, 0x0f, 0x9f, 0x1f, 0xed, 0xee, 0x3d, 0xdd, 0x6b, 0xed,
+ 0xf2, 0x6c, 0x6f, 0x77, 0xb7, 0xb5, 0x2b, 0x26, 0x09, 0x9f, 0xdc, 0x7a, 0x7e, 0x74, 0xd6, 0xda,
+ 0x15, 0x53, 0xa4, 0xb1, 0xdb, 0x3a, 0x68, 0x7c, 0xda, 0xda, 0x15, 0xd3, 0x52, 0x03, 0x0a, 0x6e,
+ 0xd0, 0xa1, 0x8f, 0x05, 0xf4, 0x57, 0xd8, 0xe4, 0xab, 0xc5, 0x1a, 0x68, 0x1d, 0x8a, 0xd3, 0x05,
+ 0x03, 0x72, 0x79, 0x63, 0x75, 0x02, 0x12, 0x06, 0xaa, 0xae, 0x0e, 0x1e, 0x9b, 0x7e, 0x01, 0x39,
+ 0x63, 0x7c, 0xae, 0x38, 0xb6, 0x1b, 0x82, 0xd9, 0x9d, 0xbb, 0xdd, 0xf8, 0x7c, 0xa0, 0x75, 0x9f,
+ 0xe1, 0x6b, 0x1e, 0xe4, 0xb2, 0xc6, 0xf8, 0xfc, 0x19, 0x33, 0x71, 0x36, 0x8c, 0xe4, 0x8c, 0x61,
+ 0xa4, 0x42, 0xc3, 0x40, 0xf7, 0xa0, 0x34, 0xd2, 0x7b, 0x58, 0x51, 0x7b, 0x3d, 0x13, 0x5b, 0x2c,
+ 0x76, 0x17, 0xb8, 0xe6, 0x22, 0xe9, 0x69, 0xb0, 0x0e, 0xe9, 0x5b, 0x01, 0xd0, 0x74, 0xa0, 0x45,
+ 0x27, 0xb0, 0xe2, 0xc5, 0x6a, 0x27, 0x01, 0x60, 0x91, 0x60, 0x33, 0x3e, 0x50, 0x07, 0xf0, 0x05,
+ 0xf1, 0x2a, 0x48, 0x26, 0x59, 0xdf, 0x9a, 0xe7, 0xaa, 0x0c, 0x3a, 0x5f, 0xba, 0x28, 0xc9, 0x05,
+ 0x17, 0x25, 0x21, 0x23, 0x57, 0xde, 0xed, 0x09, 0xbb, 0xd2, 0xd4, 0x54, 0xdd, 0xc9, 0x80, 0x5a,
+ 0x67, 0x4a, 0x8c, 0xcf, 0x33, 0x6e, 0x48, 0xc2, 0xdb, 0x0c, 0x49, 0x7a, 0x0c, 0xe2, 0x27, 0xee,
+ 0xf7, 0xbd, 0xfc, 0xd1, 0x3f, 0x4c, 0x61, 0x6a, 0x98, 0x57, 0x90, 0x27, 0xde, 0x97, 0x06, 0x8d,
+ 0x3f, 0x86, 0x82, 0xbb, 0x7a, 0xee, 0x7b, 0xa3, 0xd8, 0x65, 0xe7, 0x23, 0xf1, 0x44, 0xd0, 0x03,
+ 0x58, 0x21, 0x71, 0xc3, 0xa9, 0xfe, 0x32, 0x84, 0x30, 0x49, 0xbd, 0x61, 0x95, 0x75, 0x1c, 0x38,
+ 0xb0, 0x16, 0x89, 0xd1, 0x22, 0x8b, 0xe5, 0xb8, 0xf7, 0x7f, 0x31, 0x00, 0x72, 0xe7, 0x0b, 0x01,
+ 0xa5, 0x6c, 0x0f, 0xcb, 0x81, 0x64, 0x42, 0xfa, 0x8b, 0x24, 0x14, 0x7d, 0xd5, 0x28, 0xf4, 0x87,
+ 0x81, 0xc4, 0x6a, 0x73, 0x56, 0xe5, 0xca, 0x97, 0x55, 0x05, 0x26, 0x96, 0x5c, 0x7e, 0x62, 0x71,
+ 0x75, 0x40, 0xa7, 0x28, 0x9d, 0x5e, 0xba, 0x28, 0xfd, 0x3e, 0x20, 0x5b, 0xb7, 0xd5, 0x01, 0x09,
+ 0xde, 0xda, 0xe8, 0x52, 0x61, 0xa7, 0x9d, 0x15, 0xc2, 0x45, 0xda, 0x73, 0x46, 0x3b, 0x8e, 0x09,
+ 0x5d, 0x1a, 0x40, 0xde, 0x05, 0x26, 0x96, 0x7f, 0xc6, 0x13, 0x55, 0x7c, 0xaf, 0x43, 0x7e, 0x88,
+ 0x6d, 0x95, 0x86, 0x3d, 0x06, 0x54, 0xb9, 0xed, 0x07, 0x1f, 0x43, 0xd1, 0xf7, 0xb6, 0x89, 0x44,
+ 0xc2, 0xc3, 0xd6, 0x0b, 0x31, 0x51, 0xcf, 0x7d, 0xf9, 0xbb, 0xcd, 0xd4, 0x21, 0x7e, 0x45, 0x3e,
+ 0x25, 0xb7, 0x9a, 0xed, 0x56, 0xf3, 0x99, 0x28, 0xd4, 0x8b, 0x5f, 0xfe, 0x6e, 0x33, 0x27, 0x63,
+ 0x5a, 0xb8, 0x79, 0xf0, 0x0c, 0xaa, 0xa1, 0x1d, 0x08, 0x3a, 0x68, 0x04, 0x95, 0xdd, 0xd3, 0xe3,
+ 0x83, 0xbd, 0x66, 0xa3, 0xd3, 0x52, 0xce, 0x8e, 0x3a, 0x2d, 0x51, 0x40, 0xb7, 0x60, 0xf5, 0x60,
+ 0xef, 0x4f, 0xda, 0x1d, 0xa5, 0x79, 0xb0, 0xd7, 0x3a, 0xec, 0x28, 0x8d, 0x4e, 0xa7, 0xd1, 0x7c,
+ 0x26, 0x26, 0x1f, 0xfd, 0x07, 0x40, 0xb5, 0xb1, 0xd3, 0xdc, 0x6b, 0x18, 0xc6, 0x40, 0xeb, 0xaa,
+ 0xd4, 0xdd, 0x37, 0x21, 0x4d, 0x51, 0xe7, 0x99, 0xcf, 0xa7, 0xeb, 0xb3, 0xab, 0x71, 0xe8, 0x29,
+ 0x64, 0x28, 0x20, 0x8d, 0x66, 0xbf, 0xa7, 0xae, 0xcf, 0x29, 0xcf, 0x91, 0xc1, 0xd0, 0x73, 0x33,
+ 0xf3, 0x81, 0x75, 0x7d, 0x76, 0xb5, 0x0e, 0x1d, 0x40, 0xce, 0x01, 0xe3, 0xe6, 0xbd, 0x7a, 0xae,
+ 0xcf, 0x2d, 0xa1, 0x91, 0xa9, 0x31, 0x50, 0x73, 0xf6, 0xdb, 0xeb, 0xfa, 0x9c, 0x3a, 0x1e, 0x92,
+ 0xa1, 0xe0, 0xc1, 0xdc, 0xf3, 0x9f, 0x81, 0xd7, 0x17, 0xa8, 0x2b, 0xa2, 0xcf, 0xa1, 0x1c, 0x84,
+ 0xed, 0x16, 0x7b, 0xa1, 0x5d, 0x5f, 0xb0, 0xe6, 0x47, 0xf4, 0x07, 0x31, 0xbc, 0xc5, 0x5e, 0x6c,
+ 0xd7, 0x17, 0x2c, 0x01, 0xa2, 0xdf, 0xc0, 0xca, 0x34, 0xc6, 0xb6, 0xf8, 0x03, 0xee, 0xfa, 0x12,
+ 0x45, 0x41, 0x34, 0x04, 0x14, 0x81, 0xcd, 0x2d, 0xf1, 0x9e, 0xbb, 0xbe, 0x4c, 0x8d, 0x10, 0xf5,
+ 0xa0, 0x1a, 0xc6, 0xa6, 0x16, 0x7d, 0x86, 0x5d, 0x5f, 0xb8, 0xaa, 0xc7, 0xbe, 0x12, 0xc4, 0x48,
+ 0x16, 0x7d, 0x96, 0x5d, 0x5f, 0xb8, 0xc8, 0x87, 0x4e, 0x01, 0x7c, 0x77, 0xdb, 0x05, 0x9e, 0x69,
+ 0xd7, 0x17, 0x29, 0xf7, 0x21, 0x03, 0x56, 0xa3, 0x2e, 0xb3, 0xcb, 0xbc, 0xda, 0xae, 0x2f, 0x55,
+ 0x05, 0x24, 0xf6, 0x1c, 0xbc, 0x97, 0x2e, 0xf6, 0x8a, 0xbb, 0xbe, 0x60, 0x39, 0x70, 0x67, 0xe7,
+ 0xeb, 0x37, 0xeb, 0xc2, 0x37, 0x6f, 0xd6, 0x85, 0x6f, 0xdf, 0xac, 0x0b, 0x5f, 0x7d, 0xb7, 0x9e,
+ 0xf8, 0xe6, 0xbb, 0xf5, 0xc4, 0xbf, 0x7d, 0xb7, 0x9e, 0xf8, 0xb3, 0xfb, 0x97, 0x9a, 0xdd, 0x1f,
+ 0x9f, 0x6f, 0x75, 0xf5, 0x21, 0xfd, 0x77, 0x8e, 0xa1, 0x5e, 0x6f, 0x33, 0x9d, 0xa4, 0xe5, 0xfb,
+ 0x0f, 0xd0, 0x79, 0x96, 0xc6, 0xba, 0xc7, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x86, 0x26, 0x20,
+ 0x26, 0x23, 0x34, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -5676,16 +5676,16 @@ func (m *Request_FinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) {
}
return len(dAtA) - i, nil
}
-func (m *Request_FinalizeSnapshotSync) MarshalTo(dAtA []byte) (int, error) {
+func (m *Request_FinalizeSnapshot) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
-func (m *Request_FinalizeSnapshotSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+func (m *Request_FinalizeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
- if m.FinalizeSnapshotSync != nil {
+ if m.FinalizeSnapshot != nil {
{
- size, err := m.FinalizeSnapshotSync.MarshalToSizedBuffer(dAtA[:i])
+ size, err := m.FinalizeSnapshot.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
@@ -6114,7 +6114,7 @@ func (m *RequestApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, erro
return len(dAtA) - i, nil
}
-func (m *RequestFinalizeSnapshotSync) Marshal() (dAtA []byte, err error) {
+func (m *RequestFinalizeSnapshot) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
@@ -6124,12 +6124,12 @@ func (m *RequestFinalizeSnapshotSync) Marshal() (dAtA []byte, err error) {
return dAtA[:n], nil
}
-func (m *RequestFinalizeSnapshotSync) MarshalTo(dAtA []byte) (int, error) {
+func (m *RequestFinalizeSnapshot) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
-func (m *RequestFinalizeSnapshotSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+func (m *RequestFinalizeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
@@ -6978,16 +6978,16 @@ func (m *Response_FinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error)
}
return len(dAtA) - i, nil
}
-func (m *Response_FinalizeSnapshotSync) MarshalTo(dAtA []byte) (int, error) {
+func (m *Response_FinalizeSnapshot) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
-func (m *Response_FinalizeSnapshotSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+func (m *Response_FinalizeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
- if m.FinalizeSnapshotSync != nil {
+ if m.FinalizeSnapshot != nil {
{
- size, err := m.FinalizeSnapshotSync.MarshalToSizedBuffer(dAtA[:i])
+ size, err := m.FinalizeSnapshot.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
@@ -7536,7 +7536,7 @@ func (m *ResponseApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, err
return len(dAtA) - i, nil
}
-func (m *ResponseFinalizeSnapshotSync) Marshal() (dAtA []byte, err error) {
+func (m *ResponseFinalizeSnapshot) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
@@ -7546,12 +7546,12 @@ func (m *ResponseFinalizeSnapshotSync) Marshal() (dAtA []byte, err error) {
return dAtA[:n], nil
}
-func (m *ResponseFinalizeSnapshotSync) MarshalTo(dAtA []byte) (int, error) {
+func (m *ResponseFinalizeSnapshot) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
-func (m *ResponseFinalizeSnapshotSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+func (m *ResponseFinalizeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
@@ -8810,14 +8810,14 @@ func (m *Request_FinalizeBlock) Size() (n int) {
}
return n
}
-func (m *Request_FinalizeSnapshotSync) Size() (n int) {
+func (m *Request_FinalizeSnapshot) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
- if m.FinalizeSnapshotSync != nil {
- l = m.FinalizeSnapshotSync.Size()
+ if m.FinalizeSnapshot != nil {
+ l = m.FinalizeSnapshot.Size()
n += 2 + l + sovTypes(uint64(l))
}
return n
@@ -9005,7 +9005,7 @@ func (m *RequestApplySnapshotChunk) Size() (n int) {
return n
}
-func (m *RequestFinalizeSnapshotSync) Size() (n int) {
+func (m *RequestFinalizeSnapshot) Size() (n int) {
if m == nil {
return 0
}
@@ -9426,14 +9426,14 @@ func (m *Response_FinalizeBlock) Size() (n int) {
}
return n
}
-func (m *Response_FinalizeSnapshotSync) Size() (n int) {
+func (m *Response_FinalizeSnapshot) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
- if m.FinalizeSnapshotSync != nil {
- l = m.FinalizeSnapshotSync.Size()
+ if m.FinalizeSnapshot != nil {
+ l = m.FinalizeSnapshot.Size()
n += 2 + l + sovTypes(uint64(l))
}
return n
@@ -9687,7 +9687,7 @@ func (m *ResponseApplySnapshotChunk) Size() (n int) {
return n
}
-func (m *ResponseFinalizeSnapshotSync) Size() (n int) {
+func (m *ResponseFinalizeSnapshot) Size() (n int) {
if m == nil {
return 0
}
@@ -10705,7 +10705,7 @@ func (m *Request) Unmarshal(dAtA []byte) error {
iNdEx = postIndex
case 20:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field FinalizeSnapshotSync", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field FinalizeSnapshot", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
@@ -10732,11 +10732,11 @@ func (m *Request) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- v := &RequestFinalizeSnapshotSync{}
+ v := &RequestFinalizeSnapshot{}
if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
- m.Value = &Request_FinalizeSnapshotSync{v}
+ m.Value = &Request_FinalizeSnapshot{v}
iNdEx = postIndex
default:
iNdEx = preIndex
@@ -12002,7 +12002,7 @@ func (m *RequestApplySnapshotChunk) Unmarshal(dAtA []byte) error {
}
return nil
}
-func (m *RequestFinalizeSnapshotSync) Unmarshal(dAtA []byte) error {
+func (m *RequestFinalizeSnapshot) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
@@ -12025,10 +12025,10 @@ func (m *RequestFinalizeSnapshotSync) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
- return fmt.Errorf("proto: RequestFinalizeSnapshotSync: wiretype end group for non-group")
+ return fmt.Errorf("proto: RequestFinalizeSnapshot: wiretype end group for non-group")
}
if fieldNum <= 0 {
- return fmt.Errorf("proto: RequestFinalizeSnapshotSync: illegal tag %d (wire type %d)", fieldNum, wire)
+ return fmt.Errorf("proto: RequestFinalizeSnapshot: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
@@ -14169,7 +14169,7 @@ func (m *Response) Unmarshal(dAtA []byte) error {
iNdEx = postIndex
case 17:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field FinalizeSnapshotSync", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field FinalizeSnapshot", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
@@ -14196,11 +14196,11 @@ func (m *Response) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- v := &ResponseFinalizeSnapshotSync{}
+ v := &ResponseFinalizeSnapshot{}
if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
- m.Value = &Response_FinalizeSnapshotSync{v}
+ m.Value = &Response_FinalizeSnapshot{v}
iNdEx = postIndex
default:
iNdEx = preIndex
@@ -15812,7 +15812,7 @@ func (m *ResponseApplySnapshotChunk) Unmarshal(dAtA []byte) error {
}
return nil
}
-func (m *ResponseFinalizeSnapshotSync) Unmarshal(dAtA []byte) error {
+func (m *ResponseFinalizeSnapshot) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
@@ -15835,10 +15835,10 @@ func (m *ResponseFinalizeSnapshotSync) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
- return fmt.Errorf("proto: ResponseFinalizeSnapshotSync: wiretype end group for non-group")
+ return fmt.Errorf("proto: ResponseFinalizeSnapshot: wiretype end group for non-group")
}
if fieldNum <= 0 {
- return fmt.Errorf("proto: ResponseFinalizeSnapshotSync: illegal tag %d (wire type %d)", fieldNum, wire)
+ return fmt.Errorf("proto: ResponseFinalizeSnapshot: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
default:
diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto
index 70b2755b85..943dbac4aa 100644
--- a/proto/tendermint/abci/types.proto
+++ b/proto/tendermint/abci/types.proto
@@ -22,22 +22,22 @@ import "gogoproto/gogo.proto";
// Request types
message Request {
oneof value {
- RequestEcho echo = 1;
- RequestFlush flush = 2;
- RequestInfo info = 3;
- RequestInitChain init_chain = 4;
- RequestQuery query = 5;
- RequestCheckTx check_tx = 7;
- RequestListSnapshots list_snapshots = 11;
- RequestOfferSnapshot offer_snapshot = 12;
- RequestLoadSnapshotChunk load_snapshot_chunk = 13;
- RequestApplySnapshotChunk apply_snapshot_chunk = 14;
- RequestFinalizeSnapshotSync finalize_snapshot_sync = 20;
- RequestPrepareProposal prepare_proposal = 15;
- RequestProcessProposal process_proposal = 16;
- RequestExtendVote extend_vote = 17;
- RequestVerifyVoteExtension verify_vote_extension = 18;
- RequestFinalizeBlock finalize_block = 19;
+ RequestEcho echo = 1;
+ RequestFlush flush = 2;
+ RequestInfo info = 3;
+ RequestInitChain init_chain = 4;
+ RequestQuery query = 5;
+ RequestCheckTx check_tx = 7;
+ RequestListSnapshots list_snapshots = 11;
+ RequestOfferSnapshot offer_snapshot = 12;
+ RequestLoadSnapshotChunk load_snapshot_chunk = 13;
+ RequestApplySnapshotChunk apply_snapshot_chunk = 14;
+ RequestFinalizeSnapshot finalize_snapshot = 20;
+ RequestPrepareProposal prepare_proposal = 15;
+ RequestProcessProposal process_proposal = 16;
+ RequestExtendVote extend_vote = 17;
+ RequestVerifyVoteExtension verify_vote_extension = 18;
+ RequestFinalizeBlock finalize_block = 19;
}
reserved 6, 8, 9, 10; // RequestBeginBlock, RequestDeliverTx, RequestEndBlock, RequestCommit
}
@@ -187,7 +187,7 @@ message RequestApplySnapshotChunk {
// After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
// It includes the light block committed at the synced height, which Tenderdash uses
// to reconstruct its own state.
-message RequestFinalizeSnapshotSync {
+message RequestFinalizeSnapshot {
// light block committed at the synced height
tendermint.types.LightBlock light_block = 1;
// commit fot the `light_block`
@@ -514,23 +514,23 @@ message RequestFinalizeBlock {
message Response {
oneof value {
- ResponseException exception = 1;
- ResponseEcho echo = 2;
- ResponseFlush flush = 3;
- ResponseInfo info = 4;
- ResponseInitChain init_chain = 5;
- ResponseQuery query = 6;
- ResponseCheckTx check_tx = 7;
- ResponseListSnapshots list_snapshots = 8;
- ResponseOfferSnapshot offer_snapshot = 9;
- ResponseLoadSnapshotChunk load_snapshot_chunk = 10;
- ResponseApplySnapshotChunk apply_snapshot_chunk = 11;
- ResponseFinalizeSnapshotSync finalize_snapshot_sync = 17;
- ResponsePrepareProposal prepare_proposal = 12;
- ResponseProcessProposal process_proposal = 13;
- ResponseExtendVote extend_vote = 14;
- ResponseVerifyVoteExtension verify_vote_extension = 15;
- ResponseFinalizeBlock finalize_block = 16;
+ ResponseException exception = 1;
+ ResponseEcho echo = 2;
+ ResponseFlush flush = 3;
+ ResponseInfo info = 4;
+ ResponseInitChain init_chain = 5;
+ ResponseQuery query = 6;
+ ResponseCheckTx check_tx = 7;
+ ResponseListSnapshots list_snapshots = 8;
+ ResponseOfferSnapshot offer_snapshot = 9;
+ ResponseLoadSnapshotChunk load_snapshot_chunk = 10;
+ ResponseApplySnapshotChunk apply_snapshot_chunk = 11;
+ ResponseFinalizeSnapshot finalize_snapshot = 17;
+ ResponsePrepareProposal prepare_proposal = 12;
+ ResponseProcessProposal process_proposal = 13;
+ ResponseExtendVote extend_vote = 14;
+ ResponseVerifyVoteExtension verify_vote_extension = 15;
+ ResponseFinalizeBlock finalize_block = 16;
}
}
@@ -642,7 +642,7 @@ message ResponseApplySnapshotChunk {
}
// The response to a `RequestPrepareSnapshot` message.
-message ResponseFinalizeSnapshotSync {
+message ResponseFinalizeSnapshot {
}
message ResponsePrepareProposal {
diff --git a/spec/abci++/api.md b/spec/abci++/api.md
index 9945f1071b..69ff32169d 100644
--- a/spec/abci++/api.md
+++ b/spec/abci++/api.md
@@ -18,7 +18,7 @@
- [RequestEcho](#tendermint-abci-RequestEcho)
- [RequestExtendVote](#tendermint-abci-RequestExtendVote)
- [RequestFinalizeBlock](#tendermint-abci-RequestFinalizeBlock)
- - [RequestFinalizeSnapshotSync](#tendermint-abci-RequestFinalizeSnapshotSync)
+ - [RequestFinalizeSnapshot](#tendermint-abci-RequestFinalizeSnapshot)
- [RequestFlush](#tendermint-abci-RequestFlush)
- [RequestInfo](#tendermint-abci-RequestInfo)
- [RequestInitChain](#tendermint-abci-RequestInitChain)
@@ -36,7 +36,7 @@
- [ResponseException](#tendermint-abci-ResponseException)
- [ResponseExtendVote](#tendermint-abci-ResponseExtendVote)
- [ResponseFinalizeBlock](#tendermint-abci-ResponseFinalizeBlock)
- - [ResponseFinalizeSnapshotSync](#tendermint-abci-ResponseFinalizeSnapshotSync)
+ - [ResponseFinalizeSnapshot](#tendermint-abci-ResponseFinalizeSnapshot)
- [ResponseFlush](#tendermint-abci-ResponseFlush)
- [ResponseInfo](#tendermint-abci-ResponseInfo)
- [ResponseInitChain](#tendermint-abci-ResponseInitChain)
@@ -249,7 +249,7 @@ Request types
| offer_snapshot | [RequestOfferSnapshot](#tendermint-abci-RequestOfferSnapshot) | | |
| load_snapshot_chunk | [RequestLoadSnapshotChunk](#tendermint-abci-RequestLoadSnapshotChunk) | | |
| apply_snapshot_chunk | [RequestApplySnapshotChunk](#tendermint-abci-RequestApplySnapshotChunk) | | |
-| finalize_snapshot_sync | [RequestFinalizeSnapshotSync](#tendermint-abci-RequestFinalizeSnapshotSync) | | |
+| finalize_snapshot | [RequestFinalizeSnapshot](#tendermint-abci-RequestFinalizeSnapshot) | | |
| prepare_proposal | [RequestPrepareProposal](#tendermint-abci-RequestPrepareProposal) | | |
| process_proposal | [RequestProcessProposal](#tendermint-abci-RequestProcessProposal) | | |
| extend_vote | [RequestExtendVote](#tendermint-abci-RequestExtendVote) | | |
@@ -426,9 +426,9 @@ Finalize newly decided block.
-
+
-### RequestFinalizeSnapshotSync
+### RequestFinalizeSnapshot
After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
It includes the light block committed at the synced height, which Tenderdash uses
to reconstruct its own state.
@@ -830,7 +830,7 @@ from this condition, but not sure), and _p_ receives a Precommit message for rou
| offer_snapshot | [ResponseOfferSnapshot](#tendermint-abci-ResponseOfferSnapshot) | | |
| load_snapshot_chunk | [ResponseLoadSnapshotChunk](#tendermint-abci-ResponseLoadSnapshotChunk) | | |
| apply_snapshot_chunk | [ResponseApplySnapshotChunk](#tendermint-abci-ResponseApplySnapshotChunk) | | |
-| finalize_snapshot_sync | [ResponseFinalizeSnapshotSync](#tendermint-abci-ResponseFinalizeSnapshotSync) | | |
+| finalize_snapshot | [ResponseFinalizeSnapshot](#tendermint-abci-ResponseFinalizeSnapshot) | | |
| prepare_proposal | [ResponsePrepareProposal](#tendermint-abci-ResponsePrepareProposal) | | |
| process_proposal | [ResponseProcessProposal](#tendermint-abci-ResponseProcessProposal) | | |
| extend_vote | [ResponseExtendVote](#tendermint-abci-ResponseExtendVote) | | |
@@ -941,9 +941,9 @@ nondeterministic
-
+
-### ResponseFinalizeSnapshotSync
+### ResponseFinalizeSnapshot
The response to a `RequestPrepareSnapshot` message.
From 8f33ac1c773f760a08f14a4dd9986f60449ea916 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 15 Jan 2025 15:46:32 +0100
Subject: [PATCH 08/42] chore(proto): Updated RequestFinalizeSnapshot
---
abci/types/types.pb.go | 578 +++++++++++++-----------------
proto/tendermint/abci/types.proto | 2 -
spec/abci++/api.md | 1 -
3 files changed, 258 insertions(+), 323 deletions(-)
diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go
index 73c13f07fd..f157a7c808 100644
--- a/abci/types/types.pb.go
+++ b/abci/types/types.pb.go
@@ -1180,8 +1180,6 @@ func (m *RequestApplySnapshotChunk) GetSender() string {
type RequestFinalizeSnapshot struct {
// light block committed at the synced height
LightBlock *types1.LightBlock `protobuf:"bytes,1,opt,name=light_block,json=lightBlock,proto3" json:"light_block,omitempty"`
- // commit fot the `light_block`
- Commit *types1.Commit `protobuf:"bytes,2,opt,name=commit,proto3" json:"commit,omitempty"`
}
func (m *RequestFinalizeSnapshot) Reset() { *m = RequestFinalizeSnapshot{} }
@@ -1224,13 +1222,6 @@ func (m *RequestFinalizeSnapshot) GetLightBlock() *types1.LightBlock {
return nil
}
-func (m *RequestFinalizeSnapshot) GetCommit() *types1.Commit {
- if m != nil {
- return m.Commit
- }
- return nil
-}
-
// Prepare new block proposal, potentially altering list of transactions.
//
// #### Usage
@@ -4494,245 +4485,244 @@ func init() {
func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) }
var fileDescriptor_252557cfdd89a31a = []byte{
- // 3797 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4d, 0x70, 0x1b, 0x57,
- 0x72, 0xc6, 0xe0, 0x1f, 0x8d, 0xbf, 0xe1, 0x23, 0x25, 0x41, 0xb0, 0x45, 0x72, 0x47, 0xf1, 0x4a,
- 0xab, 0xb5, 0x49, 0xad, 0x14, 0xaf, 0xec, 0xec, 0x6e, 0xaa, 0x40, 0x10, 0x0a, 0x48, 0x51, 0x24,
- 0x3d, 0x04, 0xa9, 0x38, 0xce, 0x7a, 0x6a, 0x08, 0x3c, 0x12, 0xb3, 0x02, 0x30, 0xe3, 0x99, 0x01,
- 0x05, 0xee, 0x35, 0x49, 0x55, 0xca, 0x27, 0xdf, 0x53, 0x7b, 0x4b, 0x8e, 0xb9, 0xe7, 0x94, 0x1c,
- 0xe3, 0x54, 0x2e, 0x3e, 0xa6, 0x2a, 0x15, 0xc5, 0x25, 0xdf, 0x72, 0xdb, 0x53, 0x2e, 0x39, 0xa4,
- 0xde, 0xcf, 0xfc, 0x62, 0x06, 0x3f, 0x96, 0xab, 0x52, 0xb9, 0xe1, 0xf5, 0xeb, 0xee, 0x79, 0x3f,
- 0xfd, 0xba, 0xfb, 0x7d, 0xfd, 0x00, 0xef, 0xd8, 0x78, 0xd4, 0xc3, 0xe6, 0x50, 0x1b, 0xd9, 0xdb,
- 0xea, 0x79, 0x57, 0xdb, 0xb6, 0xaf, 0x0d, 0x6c, 0x6d, 0x19, 0xa6, 0x6e, 0xeb, 0xa8, 0xea, 0x75,
- 0x6e, 0x91, 0xce, 0xfa, 0x1d, 0x1f, 0x77, 0xd7, 0xbc, 0x36, 0x6c, 0x7d, 0xdb, 0x30, 0x75, 0xfd,
- 0x82, 0xf1, 0xd7, 0xfd, 0xca, 0xa8, 0x9e, 0xed, 0x9e, 0x6a, 0xf5, 0x79, 0xe7, 0xbb, 0x53, 0x9d,
- 0xe7, 0x03, 0xbd, 0xfb, 0x32, 0xb6, 0xd7, 0x37, 0x90, 0x40, 0x2f, 0xff, 0xee, 0x4b, 0x7c, 0xed,
- 0xf4, 0xde, 0x99, 0x92, 0x35, 0x54, 0x53, 0x1d, 0x3a, 0xdd, 0xeb, 0xbe, 0xee, 0x2b, 0x6c, 0x5a,
- 0x9a, 0x3e, 0x0a, 0x28, 0xdf, 0xb8, 0xd4, 0xf5, 0xcb, 0x01, 0xde, 0xa6, 0xad, 0xf3, 0xf1, 0xc5,
- 0xb6, 0xad, 0x0d, 0xb1, 0x65, 0xab, 0x43, 0x83, 0x33, 0xac, 0x5d, 0xea, 0x97, 0x3a, 0xfd, 0xb9,
- 0x4d, 0x7e, 0x31, 0xaa, 0xf4, 0xba, 0x00, 0x39, 0x19, 0x7f, 0x31, 0xc6, 0x96, 0x8d, 0x1e, 0x41,
- 0x1a, 0x77, 0xfb, 0x7a, 0x4d, 0xd8, 0x14, 0xee, 0x17, 0x1f, 0xbd, 0xbb, 0x15, 0x5a, 0xb7, 0x2d,
- 0xce, 0xd7, 0xea, 0xf6, 0xf5, 0x76, 0x42, 0xa6, 0xbc, 0xe8, 0x43, 0xc8, 0x5c, 0x0c, 0xc6, 0x56,
- 0xbf, 0x96, 0xa4, 0x42, 0x77, 0xe2, 0x84, 0x9e, 0x12, 0xa6, 0x76, 0x42, 0x66, 0xdc, 0xe4, 0x53,
- 0xda, 0xe8, 0x42, 0xaf, 0xa5, 0x66, 0x7f, 0x6a, 0x6f, 0x74, 0x41, 0x3f, 0x45, 0x78, 0xd1, 0x0e,
- 0x80, 0x36, 0xd2, 0x6c, 0xa5, 0xdb, 0x57, 0xb5, 0x51, 0x2d, 0x4d, 0x25, 0x7f, 0x14, 0x2f, 0xa9,
- 0xd9, 0x4d, 0xc2, 0xd8, 0x4e, 0xc8, 0x05, 0xcd, 0x69, 0x90, 0xe1, 0x7e, 0x31, 0xc6, 0xe6, 0x75,
- 0x2d, 0x33, 0x7b, 0xb8, 0x9f, 0x10, 0x26, 0x32, 0x5c, 0xca, 0x8d, 0x7e, 0x09, 0xf9, 0x6e, 0x1f,
- 0x77, 0x5f, 0x2a, 0xf6, 0xa4, 0x96, 0xa3, 0x92, 0x1b, 0x71, 0x92, 0x4d, 0xc2, 0xd7, 0x99, 0xb4,
- 0x13, 0x72, 0xae, 0xcb, 0x7e, 0xa2, 0x43, 0xa8, 0x0c, 0x34, 0xcb, 0x56, 0xac, 0x91, 0x6a, 0x58,
- 0x7d, 0xdd, 0xb6, 0x6a, 0x45, 0xaa, 0xe3, 0xbd, 0x38, 0x1d, 0x07, 0x9a, 0x65, 0x9f, 0x38, 0xcc,
- 0xed, 0x84, 0x5c, 0x1e, 0xf8, 0x09, 0x44, 0x9f, 0x7e, 0x71, 0x81, 0x4d, 0x57, 0x61, 0xad, 0x34,
- 0x5b, 0xdf, 0x11, 0xe1, 0x76, 0xe4, 0x89, 0x3e, 0xdd, 0x4f, 0x40, 0x9f, 0xc1, 0xea, 0x40, 0x57,
- 0x7b, 0xae, 0x3a, 0xa5, 0xdb, 0x1f, 0x8f, 0x5e, 0xd6, 0xca, 0x54, 0xe9, 0x4f, 0x62, 0x07, 0xa9,
- 0xab, 0x3d, 0x47, 0x45, 0x93, 0x08, 0xb4, 0x13, 0xf2, 0xca, 0x20, 0x4c, 0x44, 0x9f, 0xc3, 0x9a,
- 0x6a, 0x18, 0x83, 0xeb, 0xb0, 0xf6, 0x0a, 0xd5, 0xfe, 0x20, 0x4e, 0x7b, 0x83, 0xc8, 0x84, 0xd5,
- 0x23, 0x75, 0x8a, 0x8a, 0x5e, 0xc0, 0xca, 0x85, 0x36, 0x52, 0x07, 0xda, 0x6f, 0xb1, 0xb7, 0x1e,
- 0x6b, 0x54, 0xf9, 0xfd, 0x58, 0x63, 0xe4, 0x02, 0xbe, 0x25, 0x11, 0x2f, 0x42, 0x34, 0xd4, 0x01,
- 0xd1, 0x30, 0xb1, 0xa1, 0x9a, 0x58, 0x31, 0x4c, 0xdd, 0xd0, 0x2d, 0x75, 0x50, 0xab, 0x52, 0xbd,
- 0xf7, 0xe2, 0xf4, 0x1e, 0x33, 0xfe, 0x63, 0xce, 0xde, 0x4e, 0xc8, 0x55, 0x23, 0x48, 0x62, 0x5a,
- 0xf5, 0x2e, 0xb6, 0x2c, 0x4f, 0xab, 0x38, 0x4f, 0x2b, 0xe5, 0x0f, 0x6a, 0x0d, 0x90, 0x50, 0x0b,
- 0x8a, 0x78, 0x42, 0xc4, 0x95, 0x2b, 0xdd, 0xc6, 0xb5, 0x15, 0xaa, 0x50, 0x8a, 0x3d, 0xc0, 0x94,
- 0xf5, 0x4c, 0xb7, 0x71, 0x3b, 0x21, 0x03, 0x76, 0x5b, 0x48, 0x85, 0x1b, 0x57, 0xd8, 0xd4, 0x2e,
- 0xae, 0xa9, 0x1a, 0x85, 0xf6, 0x10, 0x47, 0x53, 0x43, 0x54, 0xe1, 0x4f, 0xe3, 0x14, 0x9e, 0x51,
- 0x21, 0xa2, 0xa2, 0xe5, 0x88, 0xb4, 0x13, 0xf2, 0xea, 0xd5, 0x34, 0x99, 0xd8, 0xae, 0xbb, 0x5d,
- 0xd4, 0x73, 0xd6, 0x56, 0x67, 0xdb, 0xae, 0xb3, 0x57, 0x3b, 0x84, 0x99, 0xd8, 0xee, 0x85, 0x9f,
- 0xb0, 0x93, 0x83, 0xcc, 0x95, 0x3a, 0x18, 0xe3, 0xfd, 0x74, 0x3e, 0x2b, 0xe6, 0xf6, 0xd3, 0xf9,
- 0xbc, 0x58, 0xd8, 0x4f, 0xe7, 0x0b, 0x22, 0xec, 0xa7, 0xf3, 0x20, 0x16, 0xa5, 0x7b, 0x50, 0xf4,
- 0xf9, 0x2d, 0x54, 0x83, 0xdc, 0x10, 0x5b, 0x96, 0x7a, 0x89, 0xa9, 0x9b, 0x2b, 0xc8, 0x4e, 0x53,
- 0xaa, 0x40, 0xc9, 0xef, 0xab, 0xa4, 0xaf, 0x04, 0x57, 0x92, 0xb8, 0x21, 0x22, 0xc9, 0xfd, 0xae,
- 0x23, 0xc9, 0x9b, 0xe8, 0x2e, 0x94, 0xe9, 0x54, 0x14, 0xa7, 0x9f, 0xf8, 0xc2, 0xb4, 0x5c, 0xa2,
- 0xc4, 0x33, 0xce, 0xb4, 0x01, 0x45, 0xe3, 0x91, 0xe1, 0xb2, 0xa4, 0x28, 0x0b, 0x18, 0x8f, 0x0c,
- 0x87, 0xe1, 0x47, 0x50, 0x22, 0xf3, 0x76, 0x39, 0xd2, 0xf4, 0x23, 0x45, 0x42, 0xe3, 0x2c, 0xd2,
- 0x5f, 0xa6, 0x40, 0x0c, 0xfb, 0x37, 0xf4, 0x11, 0xa4, 0x89, 0xab, 0xe7, 0x5e, 0xbb, 0xbe, 0xc5,
- 0xe2, 0xc0, 0x96, 0x13, 0x07, 0xb6, 0x3a, 0x4e, 0x1c, 0xd8, 0xc9, 0x7f, 0xfd, 0x7a, 0x23, 0xf1,
- 0xd5, 0x7f, 0x6e, 0x08, 0x32, 0x95, 0x40, 0xb7, 0x89, 0x57, 0x53, 0xb5, 0x91, 0xa2, 0xf5, 0xe8,
- 0x90, 0x0b, 0xc4, 0x65, 0xa9, 0xda, 0x68, 0xaf, 0x87, 0x0e, 0x40, 0xec, 0xea, 0x23, 0x0b, 0x8f,
- 0xac, 0xb1, 0xa5, 0xb0, 0x38, 0xc4, 0x7d, 0x75, 0xc0, 0xe3, 0xb2, 0x00, 0xd4, 0x74, 0x38, 0x8f,
- 0x29, 0xa3, 0x5c, 0xed, 0x06, 0x09, 0xe8, 0x10, 0xca, 0x57, 0xea, 0x40, 0xeb, 0xa9, 0xb6, 0x6e,
- 0x2a, 0x16, 0xb6, 0xb9, 0xf3, 0xbe, 0x3b, 0xb5, 0xe7, 0x67, 0x0e, 0xd7, 0x09, 0xb6, 0x4f, 0x8d,
- 0x9e, 0x6a, 0xe3, 0x9d, 0xf4, 0xd7, 0xaf, 0x37, 0x04, 0xb9, 0x74, 0xe5, 0xeb, 0x41, 0x3f, 0x86,
- 0xaa, 0x6a, 0x18, 0x8a, 0x65, 0xab, 0x36, 0x56, 0xce, 0xaf, 0x6d, 0x6c, 0x51, 0x7f, 0x5e, 0x92,
- 0xcb, 0xaa, 0x61, 0x9c, 0x10, 0xea, 0x0e, 0x21, 0xa2, 0xf7, 0xa0, 0x42, 0x5c, 0xbf, 0xa6, 0x0e,
- 0x94, 0x3e, 0xd6, 0x2e, 0xfb, 0x76, 0x2d, 0xbb, 0x29, 0xdc, 0x4f, 0xc9, 0x65, 0x4e, 0x6d, 0x53,
- 0x22, 0xda, 0x82, 0x55, 0x87, 0xad, 0xab, 0x9b, 0xd8, 0xe1, 0x25, 0x8e, 0xbe, 0x2c, 0xaf, 0xf0,
- 0xae, 0xa6, 0x6e, 0x62, 0xc6, 0x2f, 0xf5, 0x5c, 0x4b, 0xa1, 0x61, 0x02, 0x21, 0x48, 0xf7, 0x54,
- 0x5b, 0xa5, 0x3b, 0x50, 0x92, 0xe9, 0x6f, 0x42, 0x33, 0x54, 0xbb, 0xcf, 0xd7, 0x95, 0xfe, 0x46,
- 0x37, 0x21, 0xcb, 0x55, 0xa7, 0xe8, 0x30, 0x78, 0x0b, 0xad, 0x41, 0xc6, 0x30, 0xf5, 0x2b, 0x4c,
- 0x97, 0x25, 0x2f, 0xb3, 0x86, 0x24, 0x43, 0x25, 0x18, 0x52, 0x50, 0x05, 0x92, 0xf6, 0x84, 0x7f,
- 0x25, 0x69, 0x4f, 0xd0, 0x43, 0x48, 0x93, 0x0d, 0xa0, 0xdf, 0xa8, 0x44, 0x04, 0x51, 0x2e, 0xd7,
- 0xb9, 0x36, 0xb0, 0x4c, 0x39, 0xa5, 0x9b, 0xb0, 0x16, 0x15, 0x62, 0xa4, 0xbe, 0x4b, 0x0f, 0x84,
- 0x0a, 0xf4, 0x21, 0xe4, 0x5d, 0x9f, 0xca, 0xec, 0xeb, 0xf6, 0xd4, 0x57, 0x1c, 0x66, 0xd9, 0x65,
- 0x25, 0x86, 0x45, 0xf6, 0xa7, 0xaf, 0xf2, 0xbc, 0xa0, 0x24, 0xe7, 0x54, 0xc3, 0x68, 0xab, 0x56,
- 0x5f, 0xba, 0x84, 0x5a, 0x5c, 0xfc, 0xf0, 0xad, 0x8f, 0x40, 0x4f, 0x87, 0xb3, 0x3e, 0xbe, 0x93,
- 0x97, 0xa4, 0x7b, 0xe2, 0x9e, 0x3c, 0x6a, 0xc1, 0xe3, 0xd1, 0x4b, 0x62, 0xc1, 0x29, 0xf6, 0x21,
- 0xda, 0xde, 0xeb, 0x49, 0x3d, 0xb8, 0x1d, 0x1b, 0x4a, 0x02, 0x72, 0x42, 0x40, 0x8e, 0x6c, 0x06,
- 0x0b, 0x50, 0x6c, 0xe0, 0xac, 0x41, 0x86, 0x66, 0xd1, 0x79, 0xd3, 0xcf, 0x14, 0x64, 0xde, 0x92,
- 0xbe, 0x14, 0xe0, 0x56, 0x4c, 0x50, 0x41, 0xbf, 0x82, 0xe2, 0x80, 0x8c, 0x9f, 0xfb, 0xb9, 0x88,
- 0xac, 0x8a, 0x1d, 0x9f, 0x03, 0xc2, 0x44, 0xbd, 0x99, 0x0c, 0x03, 0xf7, 0x37, 0x7a, 0x08, 0xd9,
- 0xae, 0x3e, 0x1c, 0x6a, 0x36, 0x4f, 0xad, 0x6a, 0x51, 0x07, 0x8f, 0xf4, 0xcb, 0x9c, 0x4f, 0xfa,
- 0x7d, 0x1a, 0x6e, 0x46, 0x47, 0x22, 0xb4, 0x09, 0xa5, 0xa1, 0x3a, 0x51, 0xec, 0x09, 0x3f, 0x2e,
- 0x02, 0x35, 0x40, 0x18, 0xaa, 0x93, 0xce, 0x84, 0x9d, 0x15, 0x11, 0x52, 0xf6, 0xc4, 0xaa, 0x25,
- 0x37, 0x53, 0xf7, 0x4b, 0x32, 0xf9, 0x89, 0x9e, 0xc3, 0xca, 0x40, 0xef, 0xaa, 0x03, 0x65, 0xa0,
- 0x5a, 0xb6, 0xc2, 0xc7, 0xc2, 0x9c, 0xc0, 0x3b, 0xd3, 0xb6, 0x46, 0xbb, 0x89, 0xa3, 0xa4, 0x27,
- 0x36, 0x21, 0x57, 0xa9, 0xec, 0x81, 0x6a, 0xd9, 0xac, 0x0b, 0xed, 0x42, 0x71, 0xa8, 0x59, 0xe7,
- 0xb8, 0xaf, 0x5e, 0x69, 0xba, 0x59, 0x4b, 0x6f, 0xa6, 0x22, 0x33, 0xbf, 0xe7, 0x1e, 0x0f, 0xd7,
- 0xe4, 0x17, 0xf3, 0xd9, 0x48, 0x26, 0x70, 0x86, 0x1c, 0x2f, 0x98, 0x5d, 0xda, 0x0b, 0x3e, 0x84,
- 0xb5, 0x11, 0x9e, 0xd8, 0x8a, 0xeb, 0x61, 0x2c, 0x66, 0xb8, 0x39, 0xba, 0xff, 0x88, 0xf4, 0xb9,
- 0x6e, 0xc9, 0x22, 0x36, 0x4c, 0x4c, 0xc4, 0xd4, 0xc7, 0xa3, 0x5e, 0x2d, 0xbf, 0x29, 0xdc, 0xcf,
- 0xc8, 0xac, 0x81, 0x9e, 0x40, 0x8d, 0x7a, 0x0f, 0xe6, 0x52, 0xc9, 0x16, 0xe2, 0x9e, 0xe3, 0x4a,
- 0x0a, 0xd4, 0x6c, 0x6f, 0x90, 0x7e, 0xea, 0xb4, 0x0f, 0x68, 0x2f, 0x77, 0x3f, 0xdb, 0xb0, 0xc6,
- 0x52, 0x01, 0x6c, 0x92, 0x9c, 0x80, 0x6c, 0x12, 0x1d, 0x00, 0xd0, 0x01, 0xac, 0x38, 0x7d, 0xc7,
- 0xa6, 0xde, 0x99, 0xd0, 0xef, 0x3f, 0x74, 0x05, 0x7a, 0x0a, 0x39, 0x67, 0xce, 0xe1, 0x28, 0xd2,
- 0x53, 0x83, 0x9c, 0xbe, 0x86, 0xe1, 0xc6, 0x96, 0x27, 0xde, 0x09, 0x2a, 0x4d, 0x27, 0xbe, 0xbc,
- 0xcb, 0xf3, 0xe3, 0xde, 0x01, 0xdb, 0x80, 0xe2, 0x17, 0x63, 0xdd, 0x1c, 0x0f, 0xd9, 0x90, 0xca,
- 0x74, 0x48, 0xc0, 0x48, 0xf4, 0x3c, 0xff, 0x53, 0xc6, 0x67, 0x73, 0xc1, 0xa4, 0x84, 0x5b, 0x94,
- 0xe0, 0x59, 0xd4, 0x89, 0x6f, 0xe0, 0x7e, 0xa3, 0x4a, 0x2e, 0x6a, 0x54, 0xee, 0xdc, 0xe2, 0xed,
- 0x2a, 0xf5, 0xfd, 0xec, 0x0a, 0x41, 0x9a, 0xce, 0x30, 0xcd, 0x7c, 0x38, 0xf9, 0x1d, 0x6b, 0x6b,
- 0xee, 0xfe, 0x67, 0xfd, 0xfb, 0xef, 0x58, 0x60, 0xee, 0x07, 0xb3, 0xc0, 0x7c, 0xac, 0x05, 0x7e,
- 0x6f, 0x5b, 0xeb, 0xc0, 0xcd, 0x90, 0xa0, 0x32, 0xa6, 0x71, 0x96, 0x5a, 0x5b, 0xe8, 0x5a, 0xe3,
- 0x38, 0x19, 0x9f, 0x22, 0x79, 0x35, 0xa0, 0x97, 0xc5, 0xe8, 0x58, 0x0b, 0x2e, 0x2e, 0x6b, 0xc1,
- 0xa5, 0x45, 0x2c, 0xb8, 0xfc, 0x36, 0x16, 0x5c, 0x99, 0xb2, 0xe0, 0x53, 0x58, 0x99, 0xca, 0x8b,
- 0x5d, 0x73, 0x10, 0x22, 0xcd, 0x21, 0x19, 0x6d, 0x0e, 0x29, 0x9f, 0x39, 0x48, 0xdf, 0x0a, 0x50,
- 0x8f, 0x4f, 0x8f, 0x23, 0x3f, 0xf0, 0x33, 0xb8, 0xe1, 0xa5, 0x49, 0xfe, 0x75, 0x64, 0xa1, 0x08,
- 0xb9, 0x9d, 0xde, 0x42, 0xce, 0x48, 0x29, 0xd8, 0x98, 0xd2, 0x7e, 0x13, 0x7d, 0x0e, 0xd5, 0x60,
- 0x62, 0x4f, 0xf2, 0x26, 0x72, 0x5c, 0xfe, 0x60, 0xea, 0xb8, 0x78, 0x6b, 0xe1, 0x8e, 0x59, 0xae,
- 0x5c, 0xf9, 0x9b, 0x96, 0xf4, 0xaf, 0x49, 0x37, 0x6d, 0x08, 0x64, 0xe9, 0xe8, 0x63, 0x37, 0x74,
- 0x09, 0x8b, 0x9e, 0x6c, 0x2e, 0x10, 0x3e, 0xcd, 0xc9, 0xb7, 0x3b, 0xcd, 0xa9, 0xc8, 0xed, 0x4b,
- 0x47, 0x2f, 0x55, 0xc6, 0xbf, 0x54, 0x1f, 0x40, 0x86, 0x85, 0x6d, 0x16, 0x50, 0x6e, 0x4d, 0x9f,
- 0x0b, 0x16, 0xb1, 0x19, 0x17, 0x6a, 0x40, 0x9e, 0x5d, 0x01, 0xb4, 0x1e, 0x77, 0x00, 0xb7, 0x63,
- 0x24, 0xf6, 0x76, 0x77, 0x8a, 0x6f, 0x5e, 0x6f, 0xe4, 0x78, 0x43, 0xce, 0x51, 0xb9, 0xbd, 0x9e,
- 0xf4, 0x37, 0x00, 0x79, 0x19, 0x5b, 0x06, 0x31, 0x61, 0xb4, 0x03, 0x05, 0x3c, 0xe9, 0x62, 0xc3,
- 0x76, 0xae, 0x1b, 0xd1, 0xd7, 0x39, 0xc6, 0xdd, 0x72, 0x38, 0xdb, 0x09, 0xd9, 0x13, 0x43, 0x8f,
- 0x39, 0x9c, 0x13, 0x8f, 0xcc, 0x70, 0x71, 0x3f, 0x9e, 0xf3, 0x73, 0x07, 0xcf, 0x61, 0x81, 0x7e,
- 0x3d, 0x56, 0x2a, 0x04, 0xe8, 0x3c, 0xe6, 0x80, 0x4e, 0x7a, 0xce, 0xc7, 0x02, 0x88, 0x4e, 0x33,
- 0x80, 0xe8, 0x64, 0xe6, 0x4c, 0x33, 0x06, 0xd2, 0xf9, 0xb9, 0x03, 0xe9, 0x64, 0xe7, 0x8c, 0x38,
- 0x84, 0xe9, 0xfc, 0x6a, 0x0a, 0xd3, 0xd9, 0x8c, 0x15, 0x8d, 0x00, 0x75, 0x8e, 0xa6, 0x40, 0x9d,
- 0x3c, 0x55, 0xf2, 0xe3, 0x58, 0x25, 0x73, 0x50, 0x9d, 0xa3, 0x29, 0x54, 0xa7, 0x30, 0x47, 0xe1,
- 0x1c, 0x58, 0xe7, 0xcf, 0xa3, 0x61, 0x1d, 0x88, 0x05, 0x5e, 0xf8, 0x30, 0x17, 0xc3, 0x75, 0x94,
- 0x18, 0x5c, 0xa7, 0x18, 0x0b, 0x15, 0x30, 0xf5, 0x0b, 0x03, 0x3b, 0x7f, 0x1a, 0x05, 0xec, 0xac,
- 0xc4, 0x62, 0x52, 0xdc, 0x2a, 0x17, 0x41, 0x76, 0x4e, 0x23, 0x90, 0x9d, 0x52, 0x2c, 0x62, 0xc4,
- 0x14, 0x2f, 0x00, 0xed, 0x9c, 0x46, 0x40, 0x3b, 0xe5, 0xb9, 0x6a, 0xe7, 0x62, 0x3b, 0x4f, 0x83,
- 0xd8, 0x4e, 0x25, 0xe6, 0xea, 0xec, 0x39, 0x83, 0x18, 0x70, 0xe7, 0x3c, 0x0e, 0xdc, 0x61, 0xa0,
- 0xd6, 0xfb, 0xb1, 0x1a, 0x97, 0x40, 0x77, 0x8e, 0xa6, 0xd0, 0x1d, 0x71, 0x8e, 0x0d, 0x2f, 0x08,
- 0xef, 0x48, 0x3f, 0x21, 0x51, 0x3a, 0xe4, 0xee, 0x88, 0xeb, 0xc6, 0xa6, 0xa9, 0x9b, 0x1c, 0x90,
- 0x61, 0x0d, 0xe9, 0x3e, 0xb9, 0x9e, 0x7b, 0xae, 0x6d, 0x06, 0xe4, 0x53, 0x85, 0x72, 0xc0, 0x9d,
- 0x49, 0xff, 0x20, 0x78, 0xb2, 0x14, 0xf4, 0xf1, 0x5f, 0xed, 0x0b, 0xfc, 0x6a, 0x1f, 0xba, 0x8e,
- 0x16, 0x02, 0xb9, 0x86, 0x3f, 0x9b, 0xe1, 0x18, 0x8f, 0xea, 0x65, 0x31, 0x0f, 0x60, 0x85, 0xe6,
- 0xbd, 0x2c, 0x56, 0x04, 0xc2, 0x51, 0x95, 0x74, 0xb0, 0x55, 0x60, 0x71, 0xe9, 0x03, 0x58, 0xf5,
- 0xf1, 0xba, 0xf7, 0x69, 0x06, 0x74, 0x88, 0x2e, 0x77, 0x83, 0x5f, 0xac, 0xff, 0x39, 0xe5, 0xad,
- 0x90, 0x07, 0x0e, 0x45, 0xe1, 0x38, 0xc2, 0xf7, 0xc6, 0x71, 0xe2, 0xef, 0xf5, 0xe8, 0x33, 0x58,
- 0x0b, 0x40, 0x3c, 0x4e, 0x5a, 0x99, 0x5a, 0x0e, 0xe9, 0x49, 0xf8, 0xb2, 0x1c, 0xb7, 0x07, 0xfd,
- 0x1a, 0xde, 0xa1, 0x09, 0x72, 0x4c, 0xea, 0x9a, 0x5e, 0x2c, 0x75, 0xbd, 0x45, 0x74, 0x34, 0x23,
- 0xd2, 0xd7, 0x18, 0xfc, 0x27, 0x13, 0x83, 0xff, 0xa0, 0x03, 0x28, 0x5d, 0xe2, 0x11, 0xb6, 0x34,
- 0x4b, 0x59, 0xe2, 0xce, 0x29, 0x90, 0x8c, 0xbf, 0x9d, 0x90, 0x8b, 0x5c, 0x96, 0xf4, 0xfe, 0xb5,
- 0x20, 0xec, 0x54, 0xa1, 0xac, 0xf8, 0xd5, 0x49, 0xff, 0x2d, 0x78, 0x66, 0xe9, 0x02, 0x4c, 0x5d,
- 0xbd, 0xc7, 0xcc, 0xb7, 0x2c, 0xd3, 0xdf, 0xe4, 0x76, 0x35, 0xd0, 0x2f, 0xb9, 0x05, 0x92, 0x9f,
- 0x84, 0xcb, 0xad, 0xa9, 0x14, 0x78, 0x84, 0x5d, 0x83, 0x8c, 0x36, 0xea, 0xe1, 0x09, 0x37, 0x32,
- 0xd6, 0x20, 0xb2, 0x2f, 0xf1, 0x35, 0x37, 0x25, 0xf2, 0x93, 0xf0, 0xd1, 0x73, 0x46, 0xe7, 0x52,
- 0x92, 0x59, 0x03, 0x7d, 0x04, 0x05, 0x5a, 0x18, 0x53, 0x74, 0xc3, 0xe2, 0x31, 0x32, 0x90, 0xca,
- 0xb1, 0x22, 0xd6, 0xd6, 0x31, 0xe1, 0x39, 0x32, 0x2c, 0x39, 0x6f, 0xf0, 0x5f, 0xbe, 0x64, 0x2b,
- 0x1f, 0x48, 0xb6, 0xde, 0x85, 0x02, 0x19, 0xbd, 0x65, 0xa8, 0x5d, 0x4c, 0xe3, 0x5b, 0x41, 0xf6,
- 0x08, 0xd2, 0x3f, 0x0a, 0x50, 0x0d, 0x85, 0xdc, 0xc8, 0xb9, 0x3b, 0xa7, 0x32, 0x19, 0x04, 0xdc,
- 0xa6, 0x66, 0x7f, 0x07, 0xe0, 0x52, 0xb5, 0x94, 0x57, 0xea, 0xc8, 0xc6, 0x3d, 0xbe, 0x04, 0x85,
- 0x4b, 0xd5, 0x7a, 0x41, 0x09, 0xc1, 0xc1, 0x64, 0x42, 0x83, 0xf1, 0x41, 0x3e, 0x59, 0x3f, 0xe4,
- 0x83, 0xea, 0x90, 0x37, 0x4c, 0x4d, 0x37, 0x35, 0xfb, 0x9a, 0xae, 0x49, 0x4a, 0x76, 0xdb, 0xd2,
- 0x31, 0xdc, 0x88, 0x8c, 0xf6, 0xe8, 0x09, 0x14, 0xbc, 0x44, 0x41, 0xa0, 0x49, 0xed, 0x0c, 0x24,
- 0xcd, 0xe3, 0x25, 0x4b, 0x72, 0x23, 0x32, 0xde, 0xa3, 0x16, 0x64, 0x4d, 0x6c, 0x8d, 0x07, 0x2c,
- 0xc9, 0xae, 0x3c, 0xfa, 0x60, 0xb1, 0x3c, 0x81, 0x50, 0xc7, 0x03, 0x5b, 0xe6, 0xc2, 0xd2, 0xe7,
- 0x90, 0x65, 0x14, 0x54, 0x84, 0xdc, 0xe9, 0xe1, 0xb3, 0xc3, 0xa3, 0x17, 0x87, 0x62, 0x02, 0x01,
- 0x64, 0x1b, 0xcd, 0x66, 0xeb, 0xb8, 0x23, 0x0a, 0xa8, 0x00, 0x99, 0xc6, 0xce, 0x91, 0xdc, 0x11,
- 0x93, 0x84, 0x2c, 0xb7, 0xf6, 0x5b, 0xcd, 0x8e, 0x98, 0x42, 0x2b, 0x50, 0x66, 0xbf, 0x95, 0xa7,
- 0x47, 0xf2, 0xf3, 0x46, 0x47, 0x4c, 0xfb, 0x48, 0x27, 0xad, 0xc3, 0xdd, 0x96, 0x2c, 0x66, 0xa4,
- 0x9f, 0xc1, 0xed, 0xd8, 0xcc, 0xc2, 0x03, 0xdb, 0x04, 0x1f, 0xd8, 0x26, 0x7d, 0x93, 0x24, 0x57,
- 0xa7, 0xb8, 0x74, 0x01, 0xed, 0x87, 0x26, 0xfe, 0x68, 0x89, 0x5c, 0x23, 0x34, 0x7b, 0xf4, 0x1e,
- 0x54, 0x4c, 0x7c, 0x81, 0xed, 0x6e, 0x9f, 0xa5, 0x2f, 0x0e, 0x00, 0x56, 0xe6, 0x54, 0x2a, 0x64,
- 0x31, 0xb6, 0xdf, 0xe0, 0xae, 0xad, 0x30, 0x23, 0xb0, 0x28, 0xcc, 0x50, 0x20, 0x6c, 0x84, 0x7a,
- 0xc2, 0x88, 0xc4, 0xff, 0x33, 0x3f, 0xc5, 0x54, 0xa5, 0xa9, 0x2a, 0xa0, 0x6e, 0x87, 0x52, 0xa4,
- 0x57, 0x4b, 0x2d, 0x76, 0x01, 0x32, 0x72, 0xab, 0x23, 0x7f, 0x2a, 0xa6, 0x10, 0x82, 0x0a, 0xfd,
- 0xa9, 0x9c, 0x1c, 0x36, 0x8e, 0x4f, 0xda, 0x47, 0x64, 0xb1, 0x57, 0xa1, 0xea, 0x2c, 0xb6, 0x43,
- 0xcc, 0xa0, 0x1b, 0xb0, 0xd2, 0x3c, 0x7a, 0x7e, 0x7c, 0xd0, 0xea, 0xb4, 0x3c, 0x72, 0x56, 0xaa,
- 0x43, 0x2d, 0x2e, 0x45, 0x92, 0xfe, 0x3d, 0x05, 0xb7, 0x62, 0xd2, 0x1c, 0xf4, 0x11, 0x80, 0x3d,
- 0x51, 0x4c, 0xdc, 0xd5, 0xcd, 0x5e, 0xbc, 0xe1, 0x76, 0x26, 0x32, 0xe5, 0x90, 0x0b, 0x36, 0xff,
- 0x35, 0x33, 0x56, 0xfc, 0x92, 0x2b, 0x25, 0x0b, 0x61, 0x71, 0xc0, 0xe6, 0x4e, 0xc4, 0x0d, 0x14,
- 0x77, 0x89, 0x62, 0xba, 0x5f, 0x54, 0x31, 0xe5, 0x47, 0x9f, 0xc2, 0xad, 0x50, 0x48, 0xe3, 0x71,
- 0xc0, 0x8a, 0xaa, 0x09, 0x47, 0x47, 0xb6, 0x1b, 0xc1, 0xc8, 0xc6, 0xe2, 0x80, 0x35, 0x03, 0x1d,
- 0xc9, 0xbc, 0x05, 0x3a, 0x12, 0x17, 0x1a, 0xb3, 0xcb, 0x16, 0x41, 0xa2, 0x42, 0x63, 0x28, 0xe5,
- 0xc8, 0x85, 0x53, 0x0e, 0xe9, 0x7f, 0x02, 0xbb, 0x1b, 0x4c, 0x2d, 0x8f, 0x20, 0x6b, 0xd9, 0xaa,
- 0x3d, 0xb6, 0xf8, 0x49, 0x7a, 0xb2, 0x68, 0x9e, 0xba, 0xe5, 0xfc, 0x38, 0xa1, 0xe2, 0x32, 0x57,
- 0xf3, 0xff, 0x72, 0xd3, 0xe3, 0xb6, 0x27, 0xf3, 0x43, 0x6c, 0x4f, 0x1b, 0xb2, 0xf8, 0x0a, 0x8f,
- 0x6c, 0xab, 0x96, 0xa5, 0x33, 0xbe, 0x39, 0x3d, 0x63, 0xd2, 0xbd, 0x53, 0x23, 0xb9, 0xcf, 0x7f,
- 0xbd, 0xde, 0x10, 0x19, 0xf7, 0xfb, 0xfa, 0x50, 0xb3, 0xf1, 0xd0, 0xb0, 0xaf, 0x65, 0x2e, 0x2f,
- 0x7d, 0x08, 0x95, 0xe0, 0xa2, 0xc7, 0xbb, 0x10, 0xcf, 0x49, 0x27, 0xa5, 0xbf, 0x17, 0x60, 0x35,
- 0x02, 0xcb, 0x41, 0x4f, 0x78, 0xed, 0x88, 0x6d, 0xfc, 0xdd, 0xe9, 0xd5, 0x0b, 0xb0, 0x7b, 0x25,
- 0x24, 0x12, 0x34, 0xbd, 0xab, 0x03, 0xdb, 0x63, 0x8f, 0x80, 0x7e, 0x0a, 0x55, 0x4b, 0xbb, 0x1c,
- 0x29, 0x26, 0x83, 0x85, 0xdc, 0xba, 0x0c, 0xc9, 0xec, 0x49, 0x87, 0x53, 0xbd, 0xec, 0x91, 0xcc,
- 0x07, 0x81, 0xa8, 0x84, 0xb8, 0xa5, 0x2e, 0xa0, 0xe9, 0x9b, 0x4c, 0x14, 0x70, 0x25, 0xbc, 0x05,
- 0x70, 0xf5, 0x77, 0x02, 0xbc, 0x33, 0xe3, 0x76, 0x83, 0x3e, 0x09, 0x9d, 0x8b, 0x8f, 0x97, 0xb9,
- 0x1b, 0x6d, 0x31, 0x5a, 0xf0, 0x64, 0x48, 0x8f, 0xa1, 0xe4, 0xa7, 0x2f, 0xb6, 0x79, 0xfb, 0x5e,
- 0xec, 0x0f, 0x02, 0x6c, 0x77, 0xa1, 0x6c, 0x62, 0x9b, 0x38, 0xa9, 0x00, 0x22, 0x59, 0x62, 0x44,
- 0x96, 0xa6, 0xee, 0xa7, 0xf3, 0x82, 0x98, 0x74, 0xed, 0xe7, 0x5f, 0x04, 0x00, 0x0f, 0x75, 0xf3,
- 0x50, 0x2f, 0xc1, 0x8f, 0x7a, 0x85, 0xc0, 0xd2, 0x64, 0x18, 0x2c, 0x45, 0xf7, 0xa0, 0xca, 0xee,
- 0x23, 0x64, 0xdf, 0x54, 0x7b, 0x6c, 0x62, 0x8e, 0xb1, 0x55, 0x28, 0xf9, 0xc4, 0xa1, 0xa2, 0xcf,
- 0xe0, 0xb6, 0xdd, 0x37, 0xb1, 0xd5, 0xd7, 0x07, 0x3d, 0x25, 0xbc, 0x77, 0xac, 0xf6, 0xb3, 0x31,
- 0xc7, 0xe8, 0xe4, 0x5b, 0xae, 0x86, 0xb3, 0xe0, 0xfe, 0xfd, 0x16, 0x32, 0xf4, 0xd8, 0x90, 0xa4,
- 0xcf, 0xb5, 0xe2, 0x02, 0x37, 0xd0, 0x5f, 0x03, 0xa8, 0xb6, 0x6d, 0x6a, 0xe7, 0x63, 0xe2, 0x1d,
- 0x92, 0xd3, 0x9f, 0xf2, 0x8e, 0x5d, 0xc3, 0xe1, 0xdb, 0x79, 0x97, 0x9f, 0xbf, 0x35, 0x4f, 0xd4,
- 0x77, 0x06, 0x7d, 0x0a, 0xa5, 0x43, 0xa8, 0x04, 0x65, 0x9d, 0x6c, 0x9a, 0x8d, 0x21, 0x98, 0x4d,
- 0xb3, 0xec, 0x9c, 0x67, 0xd3, 0x6e, 0x2e, 0x9e, 0x62, 0x65, 0x5e, 0xda, 0x90, 0x7e, 0x2f, 0x40,
- 0xc9, 0xef, 0xf5, 0x16, 0x4e, 0x78, 0xf9, 0x05, 0x20, 0x35, 0x7d, 0x01, 0x48, 0xfb, 0x52, 0xe0,
- 0xdb, 0x90, 0x27, 0x29, 0xf0, 0xd8, 0xc2, 0x3d, 0x5e, 0xfc, 0xce, 0x5d, 0xaa, 0xd6, 0xa9, 0x85,
- 0x7b, 0x3e, 0xdf, 0x94, 0x7b, 0x3b, 0xdf, 0x14, 0x4c, 0xa4, 0xf3, 0xa1, 0x44, 0x7a, 0x3f, 0x9d,
- 0xcf, 0x88, 0x59, 0xd9, 0x97, 0x89, 0x4b, 0x7f, 0x25, 0x40, 0xde, 0x9d, 0x6f, 0xb0, 0xea, 0x1b,
- 0xc0, 0x65, 0xd9, 0x72, 0xb1, 0x9a, 0x2f, 0xbf, 0xba, 0xb0, 0x1a, 0x78, 0xca, 0xad, 0x81, 0xff,
- 0xc2, 0x4d, 0x06, 0xe3, 0x90, 0x47, 0xff, 0xe2, 0x3a, 0x60, 0x33, 0xcf, 0x7d, 0xff, 0x96, 0x8f,
- 0x83, 0x64, 0x2c, 0xe8, 0x8f, 0x20, 0xab, 0x76, 0x5d, 0xbc, 0xb5, 0x12, 0x01, 0x44, 0x3a, 0xac,
- 0x5b, 0x9d, 0x49, 0x83, 0x72, 0xca, 0x5c, 0x82, 0x8f, 0x2a, 0xe9, 0x8c, 0x4a, 0x3a, 0x20, 0x7a,
- 0x19, 0x4f, 0xf0, 0xa4, 0x57, 0x00, 0x4e, 0x0f, 0x9f, 0x1f, 0xed, 0xee, 0x3d, 0xdd, 0x6b, 0xed,
- 0xf2, 0x6c, 0x6f, 0x77, 0xb7, 0xb5, 0x2b, 0x26, 0x09, 0x9f, 0xdc, 0x7a, 0x7e, 0x74, 0xd6, 0xda,
- 0x15, 0x53, 0xa4, 0xb1, 0xdb, 0x3a, 0x68, 0x7c, 0xda, 0xda, 0x15, 0xd3, 0x52, 0x03, 0x0a, 0x6e,
- 0xd0, 0xa1, 0x8f, 0x05, 0xf4, 0x57, 0xd8, 0xe4, 0xab, 0xc5, 0x1a, 0x68, 0x1d, 0x8a, 0xd3, 0x05,
- 0x03, 0x72, 0x79, 0x63, 0x75, 0x02, 0x12, 0x06, 0xaa, 0xae, 0x0e, 0x1e, 0x9b, 0x7e, 0x01, 0x39,
- 0x63, 0x7c, 0xae, 0x38, 0xb6, 0x1b, 0x82, 0xd9, 0x9d, 0xbb, 0xdd, 0xf8, 0x7c, 0xa0, 0x75, 0x9f,
- 0xe1, 0x6b, 0x1e, 0xe4, 0xb2, 0xc6, 0xf8, 0xfc, 0x19, 0x33, 0x71, 0x36, 0x8c, 0xe4, 0x8c, 0x61,
- 0xa4, 0x42, 0xc3, 0x40, 0xf7, 0xa0, 0x34, 0xd2, 0x7b, 0x58, 0x51, 0x7b, 0x3d, 0x13, 0x5b, 0x2c,
- 0x76, 0x17, 0xb8, 0xe6, 0x22, 0xe9, 0x69, 0xb0, 0x0e, 0xe9, 0x5b, 0x01, 0xd0, 0x74, 0xa0, 0x45,
- 0x27, 0xb0, 0xe2, 0xc5, 0x6a, 0x27, 0x01, 0x60, 0x91, 0x60, 0x33, 0x3e, 0x50, 0x07, 0xf0, 0x05,
- 0xf1, 0x2a, 0x48, 0x26, 0x59, 0xdf, 0x9a, 0xe7, 0xaa, 0x0c, 0x3a, 0x5f, 0xba, 0x28, 0xc9, 0x05,
- 0x17, 0x25, 0x21, 0x23, 0x57, 0xde, 0xed, 0x09, 0xbb, 0xd2, 0xd4, 0x54, 0xdd, 0xc9, 0x80, 0x5a,
- 0x67, 0x4a, 0x8c, 0xcf, 0x33, 0x6e, 0x48, 0xc2, 0xdb, 0x0c, 0x49, 0x7a, 0x0c, 0xe2, 0x27, 0xee,
- 0xf7, 0xbd, 0xfc, 0xd1, 0x3f, 0x4c, 0x61, 0x6a, 0x98, 0x57, 0x90, 0x27, 0xde, 0x97, 0x06, 0x8d,
- 0x3f, 0x86, 0x82, 0xbb, 0x7a, 0xee, 0x7b, 0xa3, 0xd8, 0x65, 0xe7, 0x23, 0xf1, 0x44, 0xd0, 0x03,
- 0x58, 0x21, 0x71, 0xc3, 0xa9, 0xfe, 0x32, 0x84, 0x30, 0x49, 0xbd, 0x61, 0x95, 0x75, 0x1c, 0x38,
- 0xb0, 0x16, 0x89, 0xd1, 0x22, 0x8b, 0xe5, 0xb8, 0xf7, 0x7f, 0x31, 0x00, 0x72, 0xe7, 0x0b, 0x01,
- 0xa5, 0x6c, 0x0f, 0xcb, 0x81, 0x64, 0x42, 0xfa, 0x8b, 0x24, 0x14, 0x7d, 0xd5, 0x28, 0xf4, 0x87,
- 0x81, 0xc4, 0x6a, 0x73, 0x56, 0xe5, 0xca, 0x97, 0x55, 0x05, 0x26, 0x96, 0x5c, 0x7e, 0x62, 0x71,
- 0x75, 0x40, 0xa7, 0x28, 0x9d, 0x5e, 0xba, 0x28, 0xfd, 0x3e, 0x20, 0x5b, 0xb7, 0xd5, 0x01, 0x09,
- 0xde, 0xda, 0xe8, 0x52, 0x61, 0xa7, 0x9d, 0x15, 0xc2, 0x45, 0xda, 0x73, 0x46, 0x3b, 0x8e, 0x09,
- 0x5d, 0x1a, 0x40, 0xde, 0x05, 0x26, 0x96, 0x7f, 0xc6, 0x13, 0x55, 0x7c, 0xaf, 0x43, 0x7e, 0x88,
- 0x6d, 0x95, 0x86, 0x3d, 0x06, 0x54, 0xb9, 0xed, 0x07, 0x1f, 0x43, 0xd1, 0xf7, 0xb6, 0x89, 0x44,
- 0xc2, 0xc3, 0xd6, 0x0b, 0x31, 0x51, 0xcf, 0x7d, 0xf9, 0xbb, 0xcd, 0xd4, 0x21, 0x7e, 0x45, 0x3e,
- 0x25, 0xb7, 0x9a, 0xed, 0x56, 0xf3, 0x99, 0x28, 0xd4, 0x8b, 0x5f, 0xfe, 0x6e, 0x33, 0x27, 0x63,
- 0x5a, 0xb8, 0x79, 0xf0, 0x0c, 0xaa, 0xa1, 0x1d, 0x08, 0x3a, 0x68, 0x04, 0x95, 0xdd, 0xd3, 0xe3,
- 0x83, 0xbd, 0x66, 0xa3, 0xd3, 0x52, 0xce, 0x8e, 0x3a, 0x2d, 0x51, 0x40, 0xb7, 0x60, 0xf5, 0x60,
- 0xef, 0x4f, 0xda, 0x1d, 0xa5, 0x79, 0xb0, 0xd7, 0x3a, 0xec, 0x28, 0x8d, 0x4e, 0xa7, 0xd1, 0x7c,
- 0x26, 0x26, 0x1f, 0xfd, 0x07, 0x40, 0xb5, 0xb1, 0xd3, 0xdc, 0x6b, 0x18, 0xc6, 0x40, 0xeb, 0xaa,
- 0xd4, 0xdd, 0x37, 0x21, 0x4d, 0x51, 0xe7, 0x99, 0xcf, 0xa7, 0xeb, 0xb3, 0xab, 0x71, 0xe8, 0x29,
- 0x64, 0x28, 0x20, 0x8d, 0x66, 0xbf, 0xa7, 0xae, 0xcf, 0x29, 0xcf, 0x91, 0xc1, 0xd0, 0x73, 0x33,
- 0xf3, 0x81, 0x75, 0x7d, 0x76, 0xb5, 0x0e, 0x1d, 0x40, 0xce, 0x01, 0xe3, 0xe6, 0xbd, 0x7a, 0xae,
- 0xcf, 0x2d, 0xa1, 0x91, 0xa9, 0x31, 0x50, 0x73, 0xf6, 0xdb, 0xeb, 0xfa, 0x9c, 0x3a, 0x1e, 0x92,
- 0xa1, 0xe0, 0xc1, 0xdc, 0xf3, 0x9f, 0x81, 0xd7, 0x17, 0xa8, 0x2b, 0xa2, 0xcf, 0xa1, 0x1c, 0x84,
- 0xed, 0x16, 0x7b, 0xa1, 0x5d, 0x5f, 0xb0, 0xe6, 0x47, 0xf4, 0x07, 0x31, 0xbc, 0xc5, 0x5e, 0x6c,
- 0xd7, 0x17, 0x2c, 0x01, 0xa2, 0xdf, 0xc0, 0xca, 0x34, 0xc6, 0xb6, 0xf8, 0x03, 0xee, 0xfa, 0x12,
- 0x45, 0x41, 0x34, 0x04, 0x14, 0x81, 0xcd, 0x2d, 0xf1, 0x9e, 0xbb, 0xbe, 0x4c, 0x8d, 0x10, 0xf5,
- 0xa0, 0x1a, 0xc6, 0xa6, 0x16, 0x7d, 0x86, 0x5d, 0x5f, 0xb8, 0xaa, 0xc7, 0xbe, 0x12, 0xc4, 0x48,
- 0x16, 0x7d, 0x96, 0x5d, 0x5f, 0xb8, 0xc8, 0x87, 0x4e, 0x01, 0x7c, 0x77, 0xdb, 0x05, 0x9e, 0x69,
- 0xd7, 0x17, 0x29, 0xf7, 0x21, 0x03, 0x56, 0xa3, 0x2e, 0xb3, 0xcb, 0xbc, 0xda, 0xae, 0x2f, 0x55,
- 0x05, 0x24, 0xf6, 0x1c, 0xbc, 0x97, 0x2e, 0xf6, 0x8a, 0xbb, 0xbe, 0x60, 0x39, 0x70, 0x67, 0xe7,
- 0xeb, 0x37, 0xeb, 0xc2, 0x37, 0x6f, 0xd6, 0x85, 0x6f, 0xdf, 0xac, 0x0b, 0x5f, 0x7d, 0xb7, 0x9e,
- 0xf8, 0xe6, 0xbb, 0xf5, 0xc4, 0xbf, 0x7d, 0xb7, 0x9e, 0xf8, 0xb3, 0xfb, 0x97, 0x9a, 0xdd, 0x1f,
- 0x9f, 0x6f, 0x75, 0xf5, 0x21, 0xfd, 0x77, 0x8e, 0xa1, 0x5e, 0x6f, 0x33, 0x9d, 0xa4, 0xe5, 0xfb,
- 0x0f, 0xd0, 0x79, 0x96, 0xc6, 0xba, 0xc7, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x86, 0x26, 0x20,
- 0x26, 0x23, 0x34, 0x00, 0x00,
+ // 3779 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4b, 0x70, 0x1b, 0x47,
+ 0x73, 0xc6, 0xe2, 0x8d, 0xc6, 0x6b, 0x39, 0xa4, 0x24, 0x08, 0x92, 0x48, 0xfe, 0xab, 0xf8, 0x97,
+ 0x2c, 0xdb, 0xa4, 0x2d, 0xc5, 0x96, 0x1d, 0xdb, 0xa9, 0x02, 0x41, 0x28, 0x20, 0x45, 0x91, 0xf4,
+ 0x12, 0xa4, 0xec, 0x38, 0xf6, 0xd6, 0x12, 0x18, 0x12, 0x6b, 0x01, 0xd8, 0xf5, 0xee, 0x82, 0x02,
+ 0x7d, 0x4d, 0x52, 0x95, 0xf2, 0xc9, 0xf7, 0x94, 0x6f, 0xc9, 0x31, 0xf7, 0x9c, 0x92, 0x63, 0x9c,
+ 0xca, 0xc5, 0xc7, 0x54, 0xa5, 0xa2, 0xb8, 0xe4, 0x5b, 0x6e, 0x3e, 0xe5, 0x92, 0x43, 0x6a, 0x1e,
+ 0xfb, 0x04, 0x16, 0x0f, 0xcb, 0x55, 0xa9, 0xff, 0x86, 0xe9, 0xe9, 0xee, 0x9d, 0x47, 0x4f, 0x77,
+ 0xcf, 0xd7, 0x03, 0xb8, 0x61, 0xe3, 0x41, 0x07, 0x9b, 0x7d, 0x6d, 0x60, 0x6f, 0xaa, 0xa7, 0x6d,
+ 0x6d, 0xd3, 0xbe, 0x34, 0xb0, 0xb5, 0x61, 0x98, 0xba, 0xad, 0xa3, 0xb2, 0xd7, 0xb9, 0x41, 0x3a,
+ 0xab, 0xb7, 0x7c, 0xdc, 0x6d, 0xf3, 0xd2, 0xb0, 0xf5, 0x4d, 0xc3, 0xd4, 0xf5, 0x33, 0xc6, 0x5f,
+ 0xf5, 0x2b, 0xa3, 0x7a, 0x36, 0x3b, 0xaa, 0xd5, 0xe5, 0x9d, 0x37, 0xc7, 0x3a, 0x4f, 0x7b, 0x7a,
+ 0xfb, 0x59, 0x64, 0xaf, 0x6f, 0x20, 0x81, 0x5e, 0xfe, 0xdd, 0x67, 0xf8, 0xd2, 0xe9, 0xbd, 0x35,
+ 0x26, 0x6b, 0xa8, 0xa6, 0xda, 0x77, 0xba, 0x57, 0x7d, 0xdd, 0x17, 0xd8, 0xb4, 0x34, 0x7d, 0x10,
+ 0x50, 0xbe, 0x76, 0xae, 0xeb, 0xe7, 0x3d, 0xbc, 0x49, 0x5b, 0xa7, 0xc3, 0xb3, 0x4d, 0x5b, 0xeb,
+ 0x63, 0xcb, 0x56, 0xfb, 0x06, 0x67, 0x58, 0x39, 0xd7, 0xcf, 0x75, 0xfa, 0x73, 0x93, 0xfc, 0x62,
+ 0x54, 0xe9, 0x45, 0x0e, 0x32, 0x32, 0xfe, 0x7a, 0x88, 0x2d, 0x1b, 0xdd, 0x87, 0x24, 0x6e, 0x77,
+ 0xf5, 0x8a, 0xb0, 0x2e, 0xdc, 0xcd, 0xdf, 0xbf, 0xb9, 0x11, 0x5a, 0xb7, 0x0d, 0xce, 0xd7, 0x68,
+ 0x77, 0xf5, 0x66, 0x4c, 0xa6, 0xbc, 0xe8, 0x5d, 0x48, 0x9d, 0xf5, 0x86, 0x56, 0xb7, 0x12, 0xa7,
+ 0x42, 0xb7, 0xa2, 0x84, 0x1e, 0x11, 0xa6, 0x66, 0x4c, 0x66, 0xdc, 0xe4, 0x53, 0xda, 0xe0, 0x4c,
+ 0xaf, 0x24, 0xa6, 0x7f, 0x6a, 0x67, 0x70, 0x46, 0x3f, 0x45, 0x78, 0xd1, 0x16, 0x80, 0x36, 0xd0,
+ 0x6c, 0xa5, 0xdd, 0x55, 0xb5, 0x41, 0x25, 0x49, 0x25, 0x7f, 0x17, 0x2d, 0xa9, 0xd9, 0x75, 0xc2,
+ 0xd8, 0x8c, 0xc9, 0x39, 0xcd, 0x69, 0x90, 0xe1, 0x7e, 0x3d, 0xc4, 0xe6, 0x65, 0x25, 0x35, 0x7d,
+ 0xb8, 0x9f, 0x10, 0x26, 0x32, 0x5c, 0xca, 0x8d, 0x3e, 0x82, 0x6c, 0xbb, 0x8b, 0xdb, 0xcf, 0x14,
+ 0x7b, 0x54, 0xc9, 0x50, 0xc9, 0xb5, 0x28, 0xc9, 0x3a, 0xe1, 0x6b, 0x8d, 0x9a, 0x31, 0x39, 0xd3,
+ 0x66, 0x3f, 0xd1, 0x3e, 0x94, 0x7a, 0x9a, 0x65, 0x2b, 0xd6, 0x40, 0x35, 0xac, 0xae, 0x6e, 0x5b,
+ 0x95, 0x3c, 0xd5, 0xf1, 0x5a, 0x94, 0x8e, 0x3d, 0xcd, 0xb2, 0x8f, 0x1c, 0xe6, 0x66, 0x4c, 0x2e,
+ 0xf6, 0xfc, 0x04, 0xa2, 0x4f, 0x3f, 0x3b, 0xc3, 0xa6, 0xab, 0xb0, 0x52, 0x98, 0xae, 0xef, 0x80,
+ 0x70, 0x3b, 0xf2, 0x44, 0x9f, 0xee, 0x27, 0xa0, 0xcf, 0x61, 0xb9, 0xa7, 0xab, 0x1d, 0x57, 0x9d,
+ 0xd2, 0xee, 0x0e, 0x07, 0xcf, 0x2a, 0x45, 0xaa, 0xf4, 0xf5, 0xc8, 0x41, 0xea, 0x6a, 0xc7, 0x51,
+ 0x51, 0x27, 0x02, 0xcd, 0x98, 0xbc, 0xd4, 0x0b, 0x13, 0xd1, 0x97, 0xb0, 0xa2, 0x1a, 0x46, 0xef,
+ 0x32, 0xac, 0xbd, 0x44, 0xb5, 0xdf, 0x8b, 0xd2, 0x5e, 0x23, 0x32, 0x61, 0xf5, 0x48, 0x1d, 0xa3,
+ 0xa2, 0xa7, 0xb0, 0x74, 0xa6, 0x0d, 0xd4, 0x9e, 0xf6, 0x0d, 0xf6, 0xd6, 0x63, 0x85, 0x2a, 0xbf,
+ 0x1b, 0x69, 0x8c, 0x5c, 0xc0, 0xb7, 0x24, 0xe2, 0x59, 0x88, 0x86, 0x5a, 0x20, 0x1a, 0x26, 0x36,
+ 0x54, 0x13, 0x2b, 0x86, 0xa9, 0x1b, 0xba, 0xa5, 0xf6, 0x2a, 0x65, 0xaa, 0xf7, 0x4e, 0x94, 0xde,
+ 0x43, 0xc6, 0x7f, 0xc8, 0xd9, 0x9b, 0x31, 0xb9, 0x6c, 0x04, 0x49, 0x4c, 0xab, 0xde, 0xc6, 0x96,
+ 0xe5, 0x69, 0x15, 0x67, 0x69, 0xa5, 0xfc, 0x41, 0xad, 0x01, 0x12, 0x6a, 0x40, 0x1e, 0x8f, 0x88,
+ 0xb8, 0x72, 0xa1, 0xdb, 0xb8, 0xb2, 0x44, 0x15, 0x4a, 0x91, 0x07, 0x98, 0xb2, 0x9e, 0xe8, 0x36,
+ 0x6e, 0xc6, 0x64, 0xc0, 0x6e, 0x0b, 0xa9, 0x70, 0xe5, 0x02, 0x9b, 0xda, 0xd9, 0x25, 0x55, 0xa3,
+ 0xd0, 0x1e, 0xe2, 0x68, 0x2a, 0x88, 0x2a, 0x7c, 0x23, 0x4a, 0xe1, 0x09, 0x15, 0x22, 0x2a, 0x1a,
+ 0x8e, 0x48, 0x33, 0x26, 0x2f, 0x5f, 0x8c, 0x93, 0x89, 0xed, 0xba, 0xdb, 0x45, 0x3d, 0x67, 0x65,
+ 0x79, 0xba, 0xed, 0x3a, 0x7b, 0xb5, 0x45, 0x98, 0x89, 0xed, 0x9e, 0xf9, 0x09, 0x5b, 0x19, 0x48,
+ 0x5d, 0xa8, 0xbd, 0x21, 0xde, 0x4d, 0x66, 0xd3, 0x62, 0x66, 0x37, 0x99, 0xcd, 0x8a, 0xb9, 0xdd,
+ 0x64, 0x36, 0x27, 0xc2, 0x6e, 0x32, 0x0b, 0x62, 0x5e, 0xba, 0x03, 0x79, 0x9f, 0xdf, 0x42, 0x15,
+ 0xc8, 0xf4, 0xb1, 0x65, 0xa9, 0xe7, 0x98, 0xba, 0xb9, 0x9c, 0xec, 0x34, 0xa5, 0x12, 0x14, 0xfc,
+ 0xbe, 0x4a, 0xfa, 0x4e, 0x70, 0x25, 0x89, 0x1b, 0x22, 0x92, 0xdc, 0xef, 0x3a, 0x92, 0xbc, 0x89,
+ 0x6e, 0x43, 0x91, 0x4e, 0x45, 0x71, 0xfa, 0x89, 0x2f, 0x4c, 0xca, 0x05, 0x4a, 0x3c, 0xe1, 0x4c,
+ 0x6b, 0x90, 0x37, 0xee, 0x1b, 0x2e, 0x4b, 0x82, 0xb2, 0x80, 0x71, 0xdf, 0x70, 0x18, 0x7e, 0x07,
+ 0x05, 0x32, 0x6f, 0x97, 0x23, 0x49, 0x3f, 0x92, 0x27, 0x34, 0xce, 0x22, 0xfd, 0x55, 0x02, 0xc4,
+ 0xb0, 0x7f, 0x43, 0xef, 0x43, 0x92, 0xb8, 0x7a, 0xee, 0xb5, 0xab, 0x1b, 0x2c, 0x0e, 0x6c, 0x38,
+ 0x71, 0x60, 0xa3, 0xe5, 0xc4, 0x81, 0xad, 0xec, 0x0f, 0x2f, 0xd6, 0x62, 0xdf, 0xfd, 0xd7, 0x9a,
+ 0x20, 0x53, 0x09, 0x74, 0x9d, 0x78, 0x35, 0x55, 0x1b, 0x28, 0x5a, 0x87, 0x0e, 0x39, 0x47, 0x5c,
+ 0x96, 0xaa, 0x0d, 0x76, 0x3a, 0x68, 0x0f, 0xc4, 0xb6, 0x3e, 0xb0, 0xf0, 0xc0, 0x1a, 0x5a, 0x0a,
+ 0x8b, 0x43, 0xdc, 0x57, 0x07, 0x3c, 0x2e, 0x0b, 0x40, 0x75, 0x87, 0xf3, 0x90, 0x32, 0xca, 0xe5,
+ 0x76, 0x90, 0x80, 0xf6, 0xa1, 0x78, 0xa1, 0xf6, 0xb4, 0x8e, 0x6a, 0xeb, 0xa6, 0x62, 0x61, 0x9b,
+ 0x3b, 0xef, 0xdb, 0x63, 0x7b, 0x7e, 0xe2, 0x70, 0x1d, 0x61, 0xfb, 0xd8, 0xe8, 0xa8, 0x36, 0xde,
+ 0x4a, 0xfe, 0xf0, 0x62, 0x4d, 0x90, 0x0b, 0x17, 0xbe, 0x1e, 0xf4, 0x7b, 0x28, 0xab, 0x86, 0xa1,
+ 0x58, 0xb6, 0x6a, 0x63, 0xe5, 0xf4, 0xd2, 0xc6, 0x16, 0xf5, 0xe7, 0x05, 0xb9, 0xa8, 0x1a, 0xc6,
+ 0x11, 0xa1, 0x6e, 0x11, 0x22, 0x7a, 0x0d, 0x4a, 0xc4, 0xf5, 0x6b, 0x6a, 0x4f, 0xe9, 0x62, 0xed,
+ 0xbc, 0x6b, 0x57, 0xd2, 0xeb, 0xc2, 0xdd, 0x84, 0x5c, 0xe4, 0xd4, 0x26, 0x25, 0xa2, 0x0d, 0x58,
+ 0x76, 0xd8, 0xda, 0xba, 0x89, 0x1d, 0x5e, 0xe2, 0xe8, 0x8b, 0xf2, 0x12, 0xef, 0xaa, 0xeb, 0x26,
+ 0x66, 0xfc, 0x52, 0xc7, 0xb5, 0x14, 0x1a, 0x26, 0x10, 0x82, 0x64, 0x47, 0xb5, 0x55, 0xba, 0x03,
+ 0x05, 0x99, 0xfe, 0x26, 0x34, 0x43, 0xb5, 0xbb, 0x7c, 0x5d, 0xe9, 0x6f, 0x74, 0x15, 0xd2, 0x5c,
+ 0x75, 0x82, 0x0e, 0x83, 0xb7, 0xd0, 0x0a, 0xa4, 0x0c, 0x53, 0xbf, 0xc0, 0x74, 0x59, 0xb2, 0x32,
+ 0x6b, 0x48, 0x32, 0x94, 0x82, 0x21, 0x05, 0x95, 0x20, 0x6e, 0x8f, 0xf8, 0x57, 0xe2, 0xf6, 0x08,
+ 0xbd, 0x0d, 0x49, 0xb2, 0x01, 0xf4, 0x1b, 0xa5, 0x09, 0x41, 0x94, 0xcb, 0xb5, 0x2e, 0x0d, 0x2c,
+ 0x53, 0x4e, 0xe9, 0x2a, 0xac, 0x4c, 0x0a, 0x31, 0x52, 0xd7, 0xa5, 0x07, 0x42, 0x05, 0x7a, 0x17,
+ 0xb2, 0xae, 0x4f, 0x65, 0xf6, 0x75, 0x7d, 0xec, 0x2b, 0x0e, 0xb3, 0xec, 0xb2, 0x12, 0xc3, 0x22,
+ 0xfb, 0xd3, 0x55, 0x79, 0x5e, 0x50, 0x90, 0x33, 0xaa, 0x61, 0x34, 0x55, 0xab, 0x2b, 0x9d, 0x43,
+ 0x25, 0x2a, 0x7e, 0xf8, 0xd6, 0x47, 0xa0, 0xa7, 0xc3, 0x59, 0x1f, 0xdf, 0xc9, 0x8b, 0xd3, 0x3d,
+ 0x71, 0x4f, 0x1e, 0xb5, 0xe0, 0xe1, 0xe0, 0x19, 0xb1, 0xe0, 0x04, 0xfb, 0x10, 0x6d, 0xef, 0x74,
+ 0xa4, 0x0e, 0x5c, 0x8f, 0x0c, 0x25, 0x01, 0x39, 0x21, 0x20, 0x47, 0x36, 0x83, 0x05, 0x28, 0x36,
+ 0x70, 0xd6, 0x20, 0x43, 0xb3, 0xe8, 0xbc, 0xe9, 0x67, 0x72, 0x32, 0x6f, 0x49, 0x9f, 0xc2, 0xb5,
+ 0x88, 0x98, 0x82, 0x3e, 0x86, 0x7c, 0x8f, 0x0c, 0x9f, 0xbb, 0xb9, 0x09, 0x49, 0x15, 0x3b, 0x3d,
+ 0x7b, 0x84, 0x89, 0x3a, 0x33, 0x19, 0x7a, 0xee, 0x6f, 0xe9, 0x97, 0x24, 0x5c, 0x9d, 0x1c, 0x56,
+ 0xd0, 0x3a, 0x14, 0xfa, 0xea, 0x48, 0xb1, 0x47, 0xdc, 0xf6, 0x05, 0x6a, 0x4d, 0xd0, 0x57, 0x47,
+ 0xad, 0x11, 0x33, 0x7c, 0x11, 0x12, 0xf6, 0xc8, 0xaa, 0xc4, 0xd7, 0x13, 0x77, 0x0b, 0x32, 0xf9,
+ 0x89, 0x9e, 0xc0, 0x52, 0x4f, 0x6f, 0xab, 0x3d, 0xa5, 0xa7, 0x5a, 0xb6, 0xd2, 0xd6, 0xfb, 0x7d,
+ 0xcd, 0xe6, 0x27, 0xfa, 0xc6, 0xb8, 0xe1, 0xd0, 0x6e, 0xe2, 0xf5, 0xe8, 0xf1, 0x8b, 0xc9, 0x65,
+ 0x2a, 0xbb, 0xa7, 0x5a, 0x36, 0xeb, 0x42, 0xdb, 0x90, 0xef, 0x6b, 0xd6, 0x29, 0xee, 0xaa, 0x17,
+ 0x9a, 0x6e, 0x56, 0x92, 0xeb, 0x89, 0x89, 0x69, 0xdc, 0x13, 0x8f, 0x87, 0x6b, 0xf2, 0x8b, 0xf9,
+ 0x36, 0x3c, 0x15, 0x38, 0x10, 0x8e, 0x4b, 0x4b, 0x2f, 0xec, 0xd2, 0xde, 0x86, 0x95, 0x01, 0x1e,
+ 0xd9, 0x8a, 0xeb, 0x2e, 0x2c, 0x66, 0x85, 0x19, 0xba, 0x99, 0x88, 0xf4, 0xb9, 0x3e, 0xc6, 0x22,
+ 0x06, 0x49, 0xf6, 0xdb, 0xd4, 0x87, 0x83, 0x4e, 0x25, 0xbb, 0x2e, 0xdc, 0x4d, 0xc9, 0xac, 0x81,
+ 0x1e, 0x42, 0x85, 0xba, 0x02, 0xe6, 0x1f, 0xc9, 0x86, 0xe0, 0x8e, 0xe3, 0x17, 0x72, 0xd4, 0x06,
+ 0xaf, 0x90, 0x7e, 0xea, 0x81, 0xf7, 0x68, 0x2f, 0xf7, 0x25, 0x9b, 0xb0, 0xc2, 0xe2, 0x3a, 0x36,
+ 0x49, 0x80, 0x27, 0x9b, 0x44, 0x07, 0x00, 0x74, 0x00, 0x4b, 0x4e, 0xdf, 0xa1, 0xa9, 0xb7, 0x46,
+ 0xf4, 0xfb, 0x6f, 0xbb, 0x02, 0x1d, 0x85, 0x1c, 0x1a, 0xc7, 0xd2, 0xf3, 0xf4, 0x08, 0x20, 0xa7,
+ 0xaf, 0x66, 0xb8, 0x81, 0xe2, 0xa1, 0x77, 0x1c, 0x0a, 0xe3, 0x59, 0x2c, 0xef, 0xf2, 0x9c, 0xb2,
+ 0x77, 0x5a, 0xd6, 0x20, 0xff, 0xf5, 0x50, 0x37, 0x87, 0x7d, 0x36, 0xa4, 0x22, 0x1d, 0x12, 0x30,
+ 0x12, 0x3d, 0x9c, 0xff, 0x9c, 0xf2, 0xd9, 0x5c, 0x30, 0xc3, 0xe0, 0x16, 0x25, 0x78, 0x16, 0x75,
+ 0xe4, 0x1b, 0xb8, 0xdf, 0xa8, 0xe2, 0xf3, 0x1a, 0x95, 0x3b, 0xb7, 0x68, 0xbb, 0x4a, 0xfc, 0x3a,
+ 0xbb, 0x42, 0x90, 0xa4, 0x33, 0x4c, 0x32, 0x87, 0x4c, 0x7e, 0x47, 0xda, 0x9a, 0xbb, 0xff, 0x69,
+ 0xff, 0xfe, 0x3b, 0x16, 0x98, 0xf9, 0xcd, 0x2c, 0x30, 0x1b, 0x69, 0x81, 0xbf, 0xda, 0xd6, 0x5a,
+ 0x70, 0x35, 0x24, 0xa8, 0x0c, 0x69, 0xd0, 0xa4, 0xd6, 0x16, 0xba, 0xa3, 0x38, 0xa1, 0xda, 0xa7,
+ 0x48, 0x5e, 0x0e, 0xe8, 0x65, 0x01, 0x37, 0xd2, 0x82, 0xf3, 0x8b, 0x5a, 0x70, 0x61, 0x1e, 0x0b,
+ 0x2e, 0xbe, 0x8a, 0x05, 0x97, 0xc6, 0x2c, 0xf8, 0x18, 0x96, 0xc6, 0x92, 0x5c, 0xd7, 0x1c, 0x84,
+ 0x89, 0xe6, 0x10, 0x9f, 0x6c, 0x0e, 0x09, 0x9f, 0x39, 0x48, 0x3f, 0x09, 0x50, 0x8d, 0xce, 0x75,
+ 0x27, 0x7e, 0xe0, 0x1d, 0xb8, 0xe2, 0xe5, 0x3c, 0xfe, 0x75, 0x64, 0x71, 0x05, 0xb9, 0x9d, 0xde,
+ 0x42, 0x4e, 0xc9, 0x0f, 0xd8, 0x98, 0x92, 0x7e, 0x13, 0x7d, 0x02, 0xe5, 0x60, 0x96, 0x4e, 0x92,
+ 0x20, 0x72, 0x5c, 0xfe, 0x68, 0xec, 0xb8, 0x78, 0x6b, 0xe1, 0x8e, 0x59, 0x2e, 0x5d, 0xf8, 0x9b,
+ 0x96, 0xf4, 0x6f, 0x71, 0x37, 0x07, 0x08, 0xa4, 0xdc, 0xe8, 0x03, 0x48, 0xf3, 0x93, 0x2d, 0xcc,
+ 0x7b, 0xb2, 0xb9, 0x40, 0xf8, 0x34, 0xc7, 0x5f, 0xed, 0x34, 0x27, 0x26, 0x6e, 0x5f, 0x72, 0xf2,
+ 0x52, 0xa5, 0xfc, 0x4b, 0xf5, 0x16, 0xa4, 0x58, 0x10, 0x66, 0x01, 0xe5, 0xda, 0xf8, 0xb9, 0x60,
+ 0xf1, 0x97, 0x71, 0xa1, 0x1a, 0x64, 0x59, 0x3e, 0xaf, 0x75, 0xb8, 0x03, 0xb8, 0x1e, 0x21, 0xb1,
+ 0xb3, 0xbd, 0x95, 0x7f, 0xf9, 0x62, 0x2d, 0xc3, 0x1b, 0x72, 0x86, 0xca, 0xed, 0x74, 0xa4, 0xbf,
+ 0x05, 0xc8, 0xca, 0xd8, 0x32, 0x88, 0x09, 0xa3, 0x2d, 0xc8, 0xe1, 0x51, 0x1b, 0x1b, 0xb6, 0x73,
+ 0x77, 0x98, 0x7c, 0x37, 0x63, 0xdc, 0x0d, 0x87, 0xb3, 0x19, 0x93, 0x3d, 0x31, 0xf4, 0x80, 0x63,
+ 0x33, 0xd1, 0x30, 0x0b, 0x17, 0xf7, 0x83, 0x33, 0xef, 0x39, 0xe0, 0x0c, 0x0b, 0xf4, 0xab, 0x91,
+ 0x52, 0x21, 0x74, 0xe6, 0x01, 0x47, 0x67, 0x92, 0x33, 0x3e, 0x16, 0x80, 0x67, 0xea, 0x01, 0x78,
+ 0x26, 0x35, 0x63, 0x9a, 0x11, 0xf8, 0xcc, 0x7b, 0x0e, 0x3e, 0x93, 0x9e, 0x31, 0xe2, 0x10, 0x40,
+ 0xf3, 0xf1, 0x18, 0x40, 0xb3, 0x1e, 0x29, 0x3a, 0x01, 0xa1, 0x39, 0x18, 0x43, 0x68, 0xb2, 0x54,
+ 0xc9, 0xef, 0x23, 0x95, 0xcc, 0x80, 0x68, 0x0e, 0xc6, 0x20, 0x9a, 0xdc, 0x0c, 0x85, 0x33, 0x30,
+ 0x9a, 0xbf, 0x98, 0x8c, 0xd1, 0x40, 0x24, 0x8a, 0xc2, 0x87, 0x39, 0x1f, 0x48, 0xa3, 0x44, 0x80,
+ 0x34, 0xf9, 0xc8, 0x7b, 0x3f, 0x53, 0x3f, 0x37, 0x4a, 0xf3, 0xe9, 0x24, 0x94, 0x66, 0x29, 0x12,
+ 0x60, 0xe2, 0x56, 0x39, 0x0f, 0x4c, 0x73, 0x3c, 0x01, 0xa6, 0x29, 0x44, 0xc2, 0x3f, 0x4c, 0xf1,
+ 0x1c, 0x38, 0xcd, 0xf1, 0x04, 0x9c, 0xa6, 0x38, 0x53, 0xed, 0x4c, 0xa0, 0xe6, 0x51, 0x10, 0xa8,
+ 0x29, 0x45, 0xdc, 0x83, 0x3d, 0x67, 0x10, 0x81, 0xd4, 0x9c, 0x46, 0x21, 0x35, 0x0c, 0xa1, 0x7a,
+ 0x33, 0x52, 0xe3, 0x02, 0x50, 0xcd, 0xc1, 0x18, 0x54, 0x23, 0xce, 0xb0, 0xe1, 0x39, 0xb1, 0x1a,
+ 0xe9, 0x75, 0x12, 0xa5, 0x43, 0xee, 0x8e, 0xb8, 0x6e, 0x6c, 0x9a, 0xba, 0xc9, 0xd1, 0x15, 0xd6,
+ 0x90, 0xee, 0x92, 0xbb, 0xb6, 0xe7, 0xda, 0xa6, 0xe0, 0x37, 0x65, 0x28, 0x06, 0xdc, 0x99, 0xf4,
+ 0x8f, 0x82, 0x27, 0x4b, 0x11, 0x1c, 0xff, 0x3d, 0x3d, 0xc7, 0xef, 0xe9, 0xa1, 0xbb, 0x65, 0x2e,
+ 0x90, 0x6b, 0xf8, 0xb3, 0x19, 0x0e, 0xd8, 0xa8, 0x5e, 0x16, 0x73, 0x0f, 0x96, 0x68, 0xde, 0xcb,
+ 0x62, 0x45, 0x20, 0x1c, 0x95, 0x49, 0x07, 0x5b, 0x05, 0x16, 0x97, 0xde, 0x82, 0x65, 0x1f, 0xaf,
+ 0x7b, 0x39, 0x66, 0xa8, 0x85, 0xe8, 0x72, 0xd7, 0xf8, 0x2d, 0xf9, 0x5f, 0x12, 0xde, 0x0a, 0x79,
+ 0x48, 0xcf, 0x24, 0x50, 0x46, 0xf8, 0xd5, 0xa0, 0x4c, 0xf4, 0x25, 0x1d, 0x7d, 0x0e, 0x2b, 0x01,
+ 0xbc, 0xc6, 0x49, 0x2b, 0x13, 0x8b, 0xc1, 0x36, 0x31, 0x5f, 0x96, 0xe3, 0xf6, 0xa0, 0x2f, 0xe0,
+ 0x06, 0x4d, 0x90, 0x23, 0x52, 0xd7, 0xe4, 0x7c, 0xa9, 0xeb, 0x35, 0xa2, 0xa3, 0x3e, 0x21, 0x7d,
+ 0x8d, 0x00, 0x73, 0x52, 0x11, 0x60, 0x0e, 0xda, 0x83, 0xc2, 0x39, 0x1e, 0x60, 0x4b, 0xb3, 0x94,
+ 0x05, 0xee, 0x9c, 0x02, 0xc9, 0xf8, 0x9b, 0x31, 0x39, 0xcf, 0x65, 0x49, 0xef, 0xdf, 0x08, 0xc2,
+ 0x56, 0x19, 0x8a, 0x8a, 0x5f, 0x9d, 0xf4, 0x3f, 0x82, 0x67, 0x96, 0x2e, 0x5a, 0xd4, 0xd6, 0x3b,
+ 0xcc, 0x7c, 0x8b, 0x32, 0xfd, 0x4d, 0x6e, 0x57, 0x3d, 0xfd, 0x9c, 0x5b, 0x20, 0xf9, 0x49, 0xb8,
+ 0xdc, 0x02, 0x49, 0x8e, 0x47, 0xd8, 0x15, 0x48, 0x69, 0x83, 0x0e, 0x1e, 0x71, 0x23, 0x63, 0x0d,
+ 0x22, 0xfb, 0x0c, 0x5f, 0x72, 0x53, 0x22, 0x3f, 0x09, 0x1f, 0x3d, 0x67, 0x74, 0x2e, 0x05, 0x99,
+ 0x35, 0xd0, 0xfb, 0x90, 0xa3, 0x55, 0x2e, 0x45, 0x37, 0x2c, 0x1e, 0x23, 0x03, 0xa9, 0x1c, 0xab,
+ 0x48, 0x6d, 0x1c, 0x12, 0x9e, 0x03, 0xc3, 0x92, 0xb3, 0x06, 0xff, 0xe5, 0x4b, 0xb6, 0xb2, 0x81,
+ 0x64, 0xeb, 0x26, 0xe4, 0xc8, 0xe8, 0x2d, 0x43, 0x6d, 0x63, 0x1a, 0xdf, 0x72, 0xb2, 0x47, 0x90,
+ 0xfe, 0x49, 0x80, 0x72, 0x28, 0xe4, 0x4e, 0x9c, 0xbb, 0x73, 0x2a, 0xe3, 0x41, 0xf4, 0x6c, 0x6c,
+ 0xf6, 0xb7, 0x00, 0xce, 0x55, 0x4b, 0x79, 0xae, 0x0e, 0x6c, 0xdc, 0xe1, 0x4b, 0x90, 0x3b, 0x57,
+ 0xad, 0xa7, 0x94, 0x10, 0x1c, 0x4c, 0x2a, 0x34, 0x18, 0x1f, 0x7e, 0x93, 0xf6, 0xe3, 0x37, 0xa8,
+ 0x0a, 0x59, 0xc3, 0xd4, 0x74, 0x53, 0xb3, 0x2f, 0xe9, 0x9a, 0x24, 0x64, 0xb7, 0x2d, 0x1d, 0xc2,
+ 0x95, 0x89, 0xd1, 0x1e, 0x3d, 0x84, 0x9c, 0x97, 0x28, 0x08, 0x34, 0xa9, 0x9d, 0x02, 0x8b, 0x79,
+ 0xbc, 0x64, 0x49, 0xae, 0x4c, 0x8c, 0xf7, 0xa8, 0x01, 0x69, 0x13, 0x5b, 0xc3, 0x1e, 0x4b, 0xb2,
+ 0x4b, 0xf7, 0xdf, 0x9a, 0x2f, 0x4f, 0x20, 0xd4, 0x61, 0xcf, 0x96, 0xb9, 0xb0, 0xf4, 0x25, 0xa4,
+ 0x19, 0x05, 0xe5, 0x21, 0x73, 0xbc, 0xff, 0x78, 0xff, 0xe0, 0xe9, 0xbe, 0x18, 0x43, 0x00, 0xe9,
+ 0x5a, 0xbd, 0xde, 0x38, 0x6c, 0x89, 0x02, 0xca, 0x41, 0xaa, 0xb6, 0x75, 0x20, 0xb7, 0xc4, 0x38,
+ 0x21, 0xcb, 0x8d, 0xdd, 0x46, 0xbd, 0x25, 0x26, 0xd0, 0x12, 0x14, 0xd9, 0x6f, 0xe5, 0xd1, 0x81,
+ 0xfc, 0xa4, 0xd6, 0x12, 0x93, 0x3e, 0xd2, 0x51, 0x63, 0x7f, 0xbb, 0x21, 0x8b, 0x29, 0xe9, 0x1d,
+ 0xb8, 0x1e, 0x99, 0x59, 0x78, 0xc8, 0x99, 0xe0, 0x43, 0xce, 0xa4, 0x1f, 0xe3, 0xe4, 0xea, 0x14,
+ 0x95, 0x2e, 0xa0, 0xdd, 0xd0, 0xc4, 0xef, 0x2f, 0x90, 0x6b, 0x84, 0x66, 0x8f, 0x5e, 0x83, 0x92,
+ 0x89, 0xcf, 0xb0, 0xdd, 0xee, 0xb2, 0xf4, 0xc5, 0x01, 0xc0, 0x8a, 0x9c, 0x4a, 0x85, 0x2c, 0xc6,
+ 0xf6, 0x15, 0x6e, 0xdb, 0x0a, 0x33, 0x02, 0x8b, 0xc2, 0x0c, 0x39, 0xc2, 0x46, 0xa8, 0x47, 0x8c,
+ 0x48, 0xfc, 0x3f, 0xf3, 0x53, 0x4c, 0x55, 0x92, 0xaa, 0x02, 0xea, 0x76, 0x28, 0x45, 0x7a, 0xbe,
+ 0xd0, 0x62, 0xe7, 0x20, 0x25, 0x37, 0x5a, 0xf2, 0x67, 0x62, 0x02, 0x21, 0x28, 0xd1, 0x9f, 0xca,
+ 0xd1, 0x7e, 0xed, 0xf0, 0xa8, 0x79, 0x40, 0x16, 0x7b, 0x19, 0xca, 0xce, 0x62, 0x3b, 0xc4, 0x14,
+ 0xba, 0x02, 0x4b, 0xf5, 0x83, 0x27, 0x87, 0x7b, 0x8d, 0x56, 0xc3, 0x23, 0xa7, 0xa5, 0x2a, 0x54,
+ 0xa2, 0x52, 0x24, 0xe9, 0x3f, 0x12, 0x70, 0x2d, 0x22, 0xcd, 0x41, 0xef, 0x03, 0xd8, 0x23, 0xc5,
+ 0xc4, 0x6d, 0xdd, 0xec, 0x44, 0x1b, 0x6e, 0x6b, 0x24, 0x53, 0x0e, 0x39, 0x67, 0xf3, 0x5f, 0x53,
+ 0x63, 0xc5, 0x47, 0x5c, 0x29, 0x59, 0x08, 0x8b, 0x03, 0x36, 0xb7, 0x26, 0xdc, 0x40, 0x71, 0x9b,
+ 0x28, 0xa6, 0xfb, 0x45, 0x15, 0x53, 0x7e, 0xf4, 0x19, 0x5c, 0x0b, 0x85, 0x34, 0x1e, 0x07, 0xac,
+ 0x49, 0x05, 0xde, 0xc9, 0x91, 0xed, 0x4a, 0x30, 0xb2, 0xb1, 0x38, 0x60, 0x4d, 0x41, 0x47, 0x52,
+ 0xaf, 0x80, 0x8e, 0x44, 0x85, 0xc6, 0xf4, 0xa2, 0x15, 0x8d, 0x49, 0xa1, 0x31, 0x94, 0x72, 0x64,
+ 0xc2, 0x29, 0x87, 0xf4, 0xbf, 0x81, 0xdd, 0x0d, 0xa6, 0x96, 0x07, 0x90, 0xb6, 0x6c, 0xd5, 0x1e,
+ 0x5a, 0xfc, 0x24, 0x3d, 0x9c, 0x37, 0x4f, 0xdd, 0x70, 0x7e, 0x1c, 0x51, 0x71, 0x99, 0xab, 0xf9,
+ 0x83, 0xdc, 0xf4, 0xa8, 0xed, 0x49, 0xfd, 0x16, 0xdb, 0xd3, 0x84, 0x34, 0xbe, 0xc0, 0x03, 0xdb,
+ 0xaa, 0xa4, 0xe9, 0x8c, 0xaf, 0x8e, 0xcf, 0x98, 0x74, 0x6f, 0x55, 0x48, 0xee, 0xf3, 0xdf, 0x2f,
+ 0xd6, 0x44, 0xc6, 0xfd, 0xa6, 0xde, 0xd7, 0x6c, 0xdc, 0x37, 0xec, 0x4b, 0x99, 0xcb, 0x4b, 0xef,
+ 0x42, 0x29, 0xb8, 0xe8, 0xd1, 0x2e, 0xc4, 0x73, 0xd2, 0x71, 0xe9, 0x1f, 0x04, 0x58, 0x9e, 0x80,
+ 0xe5, 0xa0, 0x87, 0xbc, 0x10, 0xc4, 0x36, 0xfe, 0xf6, 0xf8, 0xea, 0x05, 0xd8, 0xbd, 0x7a, 0x10,
+ 0x09, 0x9a, 0xde, 0xd5, 0x81, 0xed, 0xb1, 0x47, 0x40, 0x6f, 0x40, 0xd9, 0xd2, 0xce, 0x07, 0x8a,
+ 0xc9, 0x60, 0x21, 0xb7, 0xc8, 0x42, 0x32, 0x7b, 0xd2, 0xe1, 0x94, 0x22, 0x3b, 0x24, 0xf3, 0x41,
+ 0x20, 0x2a, 0x21, 0x6e, 0xa9, 0x0d, 0x68, 0xfc, 0x26, 0x33, 0x09, 0xb8, 0x12, 0x5e, 0x01, 0xb8,
+ 0xfa, 0x7b, 0x01, 0x6e, 0x4c, 0xb9, 0xdd, 0xa0, 0x4f, 0x42, 0xe7, 0xe2, 0x83, 0x45, 0xee, 0x46,
+ 0x1b, 0x8c, 0x16, 0x3c, 0x19, 0xd2, 0x03, 0x28, 0xf8, 0xe9, 0xf3, 0x6d, 0xde, 0xae, 0x17, 0xfb,
+ 0x83, 0x00, 0xdb, 0x6d, 0x28, 0x9a, 0xd8, 0x26, 0x4e, 0x2a, 0x80, 0x48, 0x16, 0x18, 0x91, 0xa5,
+ 0xa9, 0xbb, 0xc9, 0xac, 0x20, 0xc6, 0x5d, 0xfb, 0xf9, 0x57, 0x01, 0xc0, 0x43, 0xdd, 0x3c, 0xd4,
+ 0x4b, 0xf0, 0xa3, 0x5e, 0x21, 0xb0, 0x34, 0x1e, 0x06, 0x4b, 0xd1, 0x1d, 0x28, 0xb3, 0xfb, 0x08,
+ 0xd9, 0x37, 0xd5, 0x1e, 0x9a, 0x98, 0x63, 0x6c, 0x25, 0x4a, 0x3e, 0x72, 0xa8, 0xe8, 0x73, 0xb8,
+ 0x6e, 0x77, 0x4d, 0x6c, 0x75, 0xf5, 0x5e, 0x47, 0x09, 0xef, 0x1d, 0xab, 0xfd, 0xac, 0xcd, 0x30,
+ 0x3a, 0xf9, 0x9a, 0xab, 0xe1, 0x24, 0xb8, 0x7f, 0xdf, 0x40, 0x8a, 0x1e, 0x1b, 0x92, 0xf4, 0xb9,
+ 0x56, 0x9c, 0xe3, 0x06, 0xfa, 0x05, 0x80, 0x6a, 0xdb, 0xa6, 0x76, 0x3a, 0x24, 0xde, 0x21, 0x3e,
+ 0xfe, 0x29, 0xef, 0xd8, 0xd5, 0x1c, 0xbe, 0xad, 0x9b, 0xfc, 0xfc, 0xad, 0x78, 0xa2, 0xbe, 0x33,
+ 0xe8, 0x53, 0x28, 0xed, 0x43, 0x29, 0x28, 0xeb, 0x64, 0xd3, 0x6c, 0x0c, 0xc1, 0x6c, 0x9a, 0x65,
+ 0xe7, 0x3c, 0x9b, 0x76, 0x73, 0xf1, 0x04, 0xab, 0xd9, 0xd2, 0x86, 0xf4, 0x8b, 0x00, 0x05, 0xbf,
+ 0xd7, 0x9b, 0x3b, 0xe1, 0xe5, 0x17, 0x80, 0xc4, 0xf8, 0x05, 0x20, 0xe9, 0x4b, 0x81, 0xaf, 0x43,
+ 0x96, 0xa4, 0xc0, 0x43, 0x0b, 0x77, 0x78, 0x25, 0x3b, 0x73, 0xae, 0x5a, 0xc7, 0x16, 0xee, 0xf8,
+ 0x7c, 0x53, 0xe6, 0xd5, 0x7c, 0x53, 0x30, 0x91, 0xce, 0x86, 0x12, 0xe9, 0xdd, 0x64, 0x36, 0x25,
+ 0xa6, 0x65, 0x5f, 0x26, 0x2e, 0xfd, 0xb5, 0x00, 0x59, 0x77, 0xbe, 0xc1, 0x12, 0x6e, 0x00, 0x97,
+ 0x65, 0xcb, 0xc5, 0x0a, 0xb8, 0xfc, 0xea, 0xc2, 0x0a, 0xda, 0x09, 0xb7, 0xa0, 0xfd, 0xa1, 0x9b,
+ 0x0c, 0x46, 0x21, 0x8f, 0xfe, 0xc5, 0x75, 0xc0, 0x66, 0x9e, 0xfb, 0xfe, 0x1d, 0x1f, 0x07, 0xc9,
+ 0x58, 0xd0, 0x9f, 0x40, 0x5a, 0x6d, 0xbb, 0x78, 0x6b, 0x69, 0x02, 0x10, 0xe9, 0xb0, 0x6e, 0xb4,
+ 0x46, 0x35, 0xca, 0x29, 0x73, 0x09, 0x3e, 0xaa, 0xb8, 0x33, 0x2a, 0x69, 0x8f, 0xe8, 0x65, 0x3c,
+ 0xc1, 0x93, 0x5e, 0x02, 0x38, 0xde, 0x7f, 0x72, 0xb0, 0xbd, 0xf3, 0x68, 0xa7, 0xb1, 0xcd, 0xb3,
+ 0xbd, 0xed, 0xed, 0xc6, 0xb6, 0x18, 0x27, 0x7c, 0x72, 0xe3, 0xc9, 0xc1, 0x49, 0x63, 0x5b, 0x4c,
+ 0x90, 0xc6, 0x76, 0x63, 0xaf, 0xf6, 0x59, 0x63, 0x5b, 0x4c, 0x4a, 0x35, 0xc8, 0xb9, 0x41, 0x87,
+ 0x56, 0xfe, 0xf5, 0xe7, 0xd8, 0xe4, 0xab, 0xc5, 0x1a, 0x68, 0x15, 0xf2, 0xe3, 0x05, 0x03, 0x72,
+ 0x79, 0x63, 0x75, 0x02, 0x12, 0x06, 0xca, 0xae, 0x0e, 0x1e, 0x9b, 0x3e, 0x84, 0x8c, 0x31, 0x3c,
+ 0x55, 0x1c, 0xdb, 0x0d, 0xc1, 0xec, 0xce, 0xdd, 0x6e, 0x78, 0xda, 0xd3, 0xda, 0x8f, 0xf1, 0x25,
+ 0x0f, 0x72, 0x69, 0x63, 0x78, 0xfa, 0x98, 0x99, 0x38, 0x1b, 0x46, 0x7c, 0xca, 0x30, 0x12, 0xa1,
+ 0x61, 0xa0, 0x3b, 0x50, 0x18, 0xe8, 0x1d, 0xac, 0xa8, 0x9d, 0x8e, 0x89, 0x2d, 0x16, 0xbb, 0x73,
+ 0x5c, 0x73, 0x9e, 0xf4, 0xd4, 0x58, 0x87, 0xf4, 0x93, 0x00, 0x68, 0x3c, 0xd0, 0xa2, 0x23, 0x58,
+ 0xf2, 0x62, 0xb5, 0x93, 0x00, 0xb0, 0x48, 0xb0, 0x1e, 0x1d, 0xa8, 0x03, 0xf8, 0x82, 0x78, 0x11,
+ 0x24, 0x93, 0xac, 0x6f, 0xc5, 0x73, 0x55, 0x06, 0x9d, 0x2f, 0x5d, 0x94, 0xf8, 0x9c, 0x8b, 0x12,
+ 0x93, 0x91, 0x2b, 0xef, 0xf6, 0x84, 0x5d, 0x69, 0x62, 0xac, 0xee, 0x64, 0x40, 0xa5, 0x35, 0x26,
+ 0xc6, 0xe7, 0x19, 0x35, 0x24, 0xe1, 0x55, 0x86, 0x24, 0x3d, 0x00, 0xf1, 0x13, 0xf7, 0xfb, 0x5e,
+ 0xfe, 0xe8, 0x1f, 0xa6, 0x30, 0x36, 0xcc, 0x0b, 0xc8, 0x12, 0xef, 0x4b, 0x83, 0xc6, 0x9f, 0x42,
+ 0xce, 0x5d, 0x3d, 0xf7, 0xf1, 0x50, 0xe4, 0xb2, 0xf3, 0x91, 0x78, 0x22, 0xe8, 0x1e, 0x2c, 0x91,
+ 0xb8, 0xe1, 0x54, 0x7f, 0x19, 0x42, 0x18, 0xa7, 0xde, 0xb0, 0xcc, 0x3a, 0xf6, 0x1c, 0x58, 0x8b,
+ 0xc4, 0x68, 0x91, 0xc5, 0x72, 0xdc, 0xf9, 0xff, 0x18, 0x00, 0xb9, 0xf3, 0x85, 0x80, 0x52, 0xb6,
+ 0x87, 0xc5, 0x40, 0x32, 0x21, 0xfd, 0x65, 0x1c, 0xf2, 0xbe, 0x6a, 0x14, 0xfa, 0xe3, 0x40, 0x62,
+ 0xb5, 0x3e, 0xad, 0x72, 0xe5, 0xcb, 0xaa, 0x02, 0x13, 0x8b, 0x2f, 0x3e, 0xb1, 0xa8, 0x3a, 0xa0,
+ 0x53, 0x94, 0x4e, 0x2e, 0x5c, 0x94, 0x7e, 0x13, 0x90, 0xad, 0xdb, 0x6a, 0x8f, 0x04, 0x6f, 0x6d,
+ 0x70, 0xae, 0xb0, 0xd3, 0xce, 0x0a, 0xe1, 0x22, 0xed, 0x39, 0xa1, 0x1d, 0x87, 0x84, 0x2e, 0xf5,
+ 0x20, 0xeb, 0x02, 0x13, 0x8b, 0xbf, 0xc9, 0x99, 0x54, 0x7c, 0xaf, 0x42, 0xb6, 0x8f, 0x6d, 0x95,
+ 0x86, 0x3d, 0x06, 0x54, 0xb9, 0xed, 0x7b, 0x1f, 0x40, 0xde, 0xf7, 0x50, 0x89, 0x44, 0xc2, 0xfd,
+ 0xc6, 0x53, 0x31, 0x56, 0xcd, 0x7c, 0xfb, 0xfd, 0x7a, 0x62, 0x1f, 0x3f, 0x27, 0x9f, 0x92, 0x1b,
+ 0xf5, 0x66, 0xa3, 0xfe, 0x58, 0x14, 0xaa, 0xf9, 0x6f, 0xbf, 0x5f, 0xcf, 0xc8, 0x98, 0x16, 0x6e,
+ 0xee, 0x3d, 0x86, 0x72, 0x68, 0x07, 0x82, 0x0e, 0x1a, 0x41, 0x69, 0xfb, 0xf8, 0x70, 0x6f, 0xa7,
+ 0x5e, 0x6b, 0x35, 0x94, 0x93, 0x83, 0x56, 0x43, 0x14, 0xd0, 0x35, 0x58, 0xde, 0xdb, 0xf9, 0xb3,
+ 0x66, 0x4b, 0xa9, 0xef, 0xed, 0x34, 0xf6, 0x5b, 0x4a, 0xad, 0xd5, 0xaa, 0xd5, 0x1f, 0x8b, 0xf1,
+ 0xfb, 0xff, 0x09, 0x50, 0xae, 0x6d, 0xd5, 0x77, 0x6a, 0x86, 0xd1, 0xd3, 0xda, 0x2a, 0x75, 0xf7,
+ 0x75, 0x48, 0x52, 0xd4, 0x79, 0xea, 0x5b, 0xe8, 0xea, 0xf4, 0x6a, 0x1c, 0x7a, 0x04, 0x29, 0x0a,
+ 0x48, 0xa3, 0xe9, 0x8f, 0xa3, 0xab, 0x33, 0xca, 0x73, 0x64, 0x30, 0xf4, 0xdc, 0x4c, 0x7d, 0x2d,
+ 0x5d, 0x9d, 0x5e, 0xad, 0x43, 0x7b, 0x90, 0x71, 0xc0, 0xb8, 0x59, 0x4f, 0x98, 0xab, 0x33, 0x4b,
+ 0x68, 0x64, 0x6a, 0x0c, 0xd4, 0x9c, 0xfe, 0x90, 0xba, 0x3a, 0xa3, 0x8e, 0x87, 0x64, 0xc8, 0x79,
+ 0x30, 0xf7, 0xec, 0x37, 0xdd, 0xd5, 0x39, 0xea, 0x8a, 0xe8, 0x4b, 0x28, 0x06, 0x61, 0xbb, 0xf9,
+ 0x9e, 0x5b, 0x57, 0xe7, 0xac, 0xf9, 0x11, 0xfd, 0x41, 0x0c, 0x6f, 0xbe, 0xe7, 0xd7, 0xd5, 0x39,
+ 0x4b, 0x80, 0xe8, 0x2b, 0x58, 0x1a, 0xc7, 0xd8, 0xe6, 0x7f, 0x8d, 0x5d, 0x5d, 0xa0, 0x28, 0x88,
+ 0xfa, 0x80, 0x26, 0x60, 0x73, 0x0b, 0x3c, 0xce, 0xae, 0x2e, 0x52, 0x23, 0x44, 0x1d, 0x28, 0x87,
+ 0xb1, 0xa9, 0x79, 0xdf, 0x54, 0x57, 0xe7, 0xae, 0xea, 0xb1, 0xaf, 0x04, 0x31, 0x92, 0x79, 0xdf,
+ 0x58, 0x57, 0xe7, 0x2e, 0xf2, 0xa1, 0x63, 0x00, 0xdf, 0xdd, 0x76, 0x8e, 0x37, 0xd7, 0xd5, 0x79,
+ 0xca, 0x7d, 0xc8, 0x80, 0xe5, 0x49, 0x97, 0xd9, 0x45, 0x9e, 0x60, 0x57, 0x17, 0xaa, 0x02, 0x12,
+ 0x7b, 0x0e, 0xde, 0x4b, 0xe7, 0x7b, 0x92, 0x5d, 0x9d, 0xb3, 0x1c, 0xb8, 0xb5, 0xf5, 0xc3, 0xcb,
+ 0x55, 0xe1, 0xc7, 0x97, 0xab, 0xc2, 0x4f, 0x2f, 0x57, 0x85, 0xef, 0x7e, 0x5e, 0x8d, 0xfd, 0xf8,
+ 0xf3, 0x6a, 0xec, 0xdf, 0x7f, 0x5e, 0x8d, 0xfd, 0xf9, 0xdd, 0x73, 0xcd, 0xee, 0x0e, 0x4f, 0x37,
+ 0xda, 0x7a, 0x9f, 0xfe, 0xd5, 0xc6, 0x50, 0x2f, 0x37, 0x99, 0x4e, 0xd2, 0xf2, 0xfd, 0xa1, 0xe7,
+ 0x34, 0x4d, 0x63, 0xdd, 0x83, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x98, 0x78, 0x79, 0x4b, 0xf0,
+ 0x33, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -6134,18 +6124,6 @@ func (m *RequestFinalizeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error)
_ = i
var l int
_ = l
- if m.Commit != nil {
- {
- size, err := m.Commit.MarshalToSizedBuffer(dAtA[:i])
- if err != nil {
- return 0, err
- }
- i -= size
- i = encodeVarintTypes(dAtA, i, uint64(size))
- }
- i--
- dAtA[i] = 0x12
- }
if m.LightBlock != nil {
{
size, err := m.LightBlock.MarshalToSizedBuffer(dAtA[:i])
@@ -6229,12 +6207,12 @@ func (m *RequestPrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error)
i--
dAtA[i] = 0x3a
}
- n24, err24 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err24 != nil {
- return 0, err24
+ n23, err23 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err23 != nil {
+ return 0, err23
}
- i -= n24
- i = encodeVarintTypes(dAtA, i, uint64(n24))
+ i -= n23
+ i = encodeVarintTypes(dAtA, i, uint64(n23))
i--
dAtA[i] = 0x32
if m.Height != 0 {
@@ -6358,12 +6336,12 @@ func (m *RequestProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error)
i--
dAtA[i] = 0x42
}
- n28, err28 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err28 != nil {
- return 0, err28
+ n27, err27 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err27 != nil {
+ return 0, err27
}
- i -= n28
- i = encodeVarintTypes(dAtA, i, uint64(n28))
+ i -= n27
+ i = encodeVarintTypes(dAtA, i, uint64(n27))
i--
dAtA[i] = 0x3a
if m.Round != 0 {
@@ -7224,12 +7202,12 @@ func (m *ResponseInitChain_GenesisTime) MarshalTo(dAtA []byte) (int, error) {
func (m *ResponseInitChain_GenesisTime) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
if m.GenesisTime != nil {
- n53, err53 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.GenesisTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.GenesisTime):])
- if err53 != nil {
- return 0, err53
+ n52, err52 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.GenesisTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.GenesisTime):])
+ if err52 != nil {
+ return 0, err52
}
- i -= n53
- i = encodeVarintTypes(dAtA, i, uint64(n53))
+ i -= n52
+ i = encodeVarintTypes(dAtA, i, uint64(n52))
i--
dAtA[i] = 0x32
}
@@ -8529,12 +8507,12 @@ func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i--
dAtA[i] = 0x28
}
- n66, err66 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err66 != nil {
- return 0, err66
+ n65, err65 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err65 != nil {
+ return 0, err65
}
- i -= n66
- i = encodeVarintTypes(dAtA, i, uint64(n66))
+ i -= n65
+ i = encodeVarintTypes(dAtA, i, uint64(n65))
i--
dAtA[i] = 0x22
if m.Height != 0 {
@@ -9015,10 +8993,6 @@ func (m *RequestFinalizeSnapshot) Size() (n int) {
l = m.LightBlock.Size()
n += 1 + l + sovTypes(uint64(l))
}
- if m.Commit != nil {
- l = m.Commit.Size()
- n += 1 + l + sovTypes(uint64(l))
- }
return n
}
@@ -12067,42 +12041,6 @@ func (m *RequestFinalizeSnapshot) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
- case 2:
- if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Commit", wireType)
- }
- var msglen int
- for shift := uint(0); ; shift += 7 {
- if shift >= 64 {
- return ErrIntOverflowTypes
- }
- if iNdEx >= l {
- return io.ErrUnexpectedEOF
- }
- b := dAtA[iNdEx]
- iNdEx++
- msglen |= int(b&0x7F) << shift
- if b < 0x80 {
- break
- }
- }
- if msglen < 0 {
- return ErrInvalidLengthTypes
- }
- postIndex := iNdEx + msglen
- if postIndex < 0 {
- return ErrInvalidLengthTypes
- }
- if postIndex > l {
- return io.ErrUnexpectedEOF
- }
- if m.Commit == nil {
- m.Commit = &types1.Commit{}
- }
- if err := m.Commit.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
- return err
- }
- iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipTypes(dAtA[iNdEx:])
diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto
index 943dbac4aa..143fd5cc92 100644
--- a/proto/tendermint/abci/types.proto
+++ b/proto/tendermint/abci/types.proto
@@ -190,8 +190,6 @@ message RequestApplySnapshotChunk {
message RequestFinalizeSnapshot {
// light block committed at the synced height
tendermint.types.LightBlock light_block = 1;
- // commit fot the `light_block`
- tendermint.types.Commit commit = 2;
}
// Prepare new block proposal, potentially altering list of transactions.
diff --git a/spec/abci++/api.md b/spec/abci++/api.md
index 69ff32169d..abc33a6eb7 100644
--- a/spec/abci++/api.md
+++ b/spec/abci++/api.md
@@ -437,7 +437,6 @@ to reconstruct its own state.
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| light_block | [tendermint.types.LightBlock](#tendermint-types-LightBlock) | | light block committed at the synced height |
-| commit | [tendermint.types.Commit](#tendermint-types-Commit) | | commit fot the `light_block` |
From 6027abefe3fe54181ad6eb389419303a22e6b8f6 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 15 Jan 2025 16:35:53 +0100
Subject: [PATCH 09/42] chore: FinalizeSnapshot implemented, not tested
---
abci/client/grpc_client.go | 4 +
abci/client/mocks/client.go | 59 +++
abci/client/routed_client.go | 5 +
abci/client/socket_client.go | 8 +
abci/types/application.go | 6 +
abci/types/messages.go | 6 +
abci/types/mocks/application.go | 59 +++
abci/types/types.pb.go | 513 ++++++++++++----------
internal/statesync/mocks/stateprovider.go | 59 +++
internal/statesync/stateprovider.go | 16 +
internal/statesync/syncer.go | 34 +-
proto/tendermint/abci/types.proto | 1 +
spec/abci++/api.md | 1 +
13 files changed, 529 insertions(+), 242 deletions(-)
diff --git a/abci/client/grpc_client.go b/abci/client/grpc_client.go
index 0ffed9b399..d8e57bd45e 100644
--- a/abci/client/grpc_client.go
+++ b/abci/client/grpc_client.go
@@ -255,6 +255,10 @@ func (cli *grpcClient) ApplySnapshotChunk(ctx context.Context, params *types.Req
return cli.client.ApplySnapshotChunk(ctx, types.ToRequestApplySnapshotChunk(params).GetApplySnapshotChunk(), grpc.WaitForReady(true))
}
+func (cli *grpcClient) FinalizeSnapshot(ctx context.Context, params *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error) {
+ return cli.client.FinalizeSnapshot(ctx, types.ToRequestFinalizeSnapshot(params).GetFinalizeSnapshot(), grpc.WaitForReady(true))
+}
+
func (cli *grpcClient) PrepareProposal(ctx context.Context, params *types.RequestPrepareProposal) (*types.ResponsePrepareProposal, error) {
return cli.client.PrepareProposal(ctx, types.ToRequestPrepareProposal(params).GetPrepareProposal(), grpc.WaitForReady(true))
}
diff --git a/abci/client/mocks/client.go b/abci/client/mocks/client.go
index 7c2d062858..9994b266df 100644
--- a/abci/client/mocks/client.go
+++ b/abci/client/mocks/client.go
@@ -362,6 +362,65 @@ func (_c *Client_FinalizeBlock_Call) RunAndReturn(run func(context.Context, *typ
return _c
}
+// FinalizeSnapshot provides a mock function with given fields: _a0, _a1
+func (_m *Client) FinalizeSnapshot(_a0 context.Context, _a1 *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error) {
+ ret := _m.Called(_a0, _a1)
+
+ if len(ret) == 0 {
+ panic("no return value specified for FinalizeSnapshot")
+ }
+
+ var r0 *types.ResponseFinalizeSnapshot
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error)); ok {
+ return rf(_a0, _a1)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFinalizeSnapshot) *types.ResponseFinalizeSnapshot); ok {
+ r0 = rf(_a0, _a1)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*types.ResponseFinalizeSnapshot)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *types.RequestFinalizeSnapshot) error); ok {
+ r1 = rf(_a0, _a1)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// Client_FinalizeSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FinalizeSnapshot'
+type Client_FinalizeSnapshot_Call struct {
+ *mock.Call
+}
+
+// FinalizeSnapshot is a helper method to define mock.On call
+// - _a0 context.Context
+// - _a1 *types.RequestFinalizeSnapshot
+func (_e *Client_Expecter) FinalizeSnapshot(_a0 interface{}, _a1 interface{}) *Client_FinalizeSnapshot_Call {
+ return &Client_FinalizeSnapshot_Call{Call: _e.mock.On("FinalizeSnapshot", _a0, _a1)}
+}
+
+func (_c *Client_FinalizeSnapshot_Call) Run(run func(_a0 context.Context, _a1 *types.RequestFinalizeSnapshot)) *Client_FinalizeSnapshot_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(context.Context), args[1].(*types.RequestFinalizeSnapshot))
+ })
+ return _c
+}
+
+func (_c *Client_FinalizeSnapshot_Call) Return(_a0 *types.ResponseFinalizeSnapshot, _a1 error) *Client_FinalizeSnapshot_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *Client_FinalizeSnapshot_Call) RunAndReturn(run func(context.Context, *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error)) *Client_FinalizeSnapshot_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// Flush provides a mock function with given fields: _a0
func (_m *Client) Flush(_a0 context.Context) error {
ret := _m.Called(_a0)
diff --git a/abci/client/routed_client.go b/abci/client/routed_client.go
index fa1afc1bc3..2bc4a8aac1 100644
--- a/abci/client/routed_client.go
+++ b/abci/client/routed_client.go
@@ -351,6 +351,11 @@ func (cli *routedClient) ApplySnapshotChunk(ctx context.Context, req *types.Requ
return result.(*types.ResponseApplySnapshotChunk), err
}
+func (cli *routedClient) FinalizeSnapshot(ctx context.Context, req *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error) {
+ result, err := cli.delegate(ctx, req)
+ return result.(*types.ResponseFinalizeSnapshot), err
+}
+
func (cli *routedClient) PrepareProposal(ctx context.Context, req *types.RequestPrepareProposal) (*types.ResponsePrepareProposal, error) {
result, err := cli.delegate(ctx, req)
return result.(*types.ResponsePrepareProposal), err
diff --git a/abci/client/socket_client.go b/abci/client/socket_client.go
index fb046187d8..e80fe9d998 100644
--- a/abci/client/socket_client.go
+++ b/abci/client/socket_client.go
@@ -357,6 +357,14 @@ func (cli *socketClient) ApplySnapshotChunk(ctx context.Context, req *types.Requ
return res.GetApplySnapshotChunk(), nil
}
+func (cli *socketClient) FinalizeSnapshot(ctx context.Context, req *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error) {
+ res, err := cli.doRequest(ctx, types.ToRequestFinalizeSnapshot(req))
+ if err != nil {
+ return nil, err
+ }
+ return res.GetFinalizeSnapshot(), nil
+}
+
func (cli *socketClient) PrepareProposal(ctx context.Context, req *types.RequestPrepareProposal) (*types.ResponsePrepareProposal, error) {
res, err := cli.doRequest(ctx, types.ToRequestPrepareProposal(req))
if err != nil {
diff --git a/abci/types/application.go b/abci/types/application.go
index fe7b60bca4..9000d8a884 100644
--- a/abci/types/application.go
+++ b/abci/types/application.go
@@ -16,6 +16,8 @@ type StateSyncer interface {
LoadSnapshotChunk(context.Context, *RequestLoadSnapshotChunk) (*ResponseLoadSnapshotChunk, error)
// ApplySnapshotChunk applies a chunk of snapshot
ApplySnapshotChunk(context.Context, *RequestApplySnapshotChunk) (*ResponseApplySnapshotChunk, error)
+ // FinalizeSnapshot sends light block to ABCI app after successful state sync
+ FinalizeSnapshot(context.Context, *RequestFinalizeSnapshot) (*ResponseFinalizeSnapshot, error)
}
// Application is an interface that enables any finite, deterministic state machine
@@ -97,6 +99,10 @@ func (BaseApplication) ApplySnapshotChunk(_ context.Context, _req *RequestApplyS
return &ResponseApplySnapshotChunk{}, nil
}
+func (BaseApplication) FinalizeSnapshot(_ context.Context, _req *RequestFinalizeSnapshot) (*ResponseFinalizeSnapshot, error) {
+ return &ResponseFinalizeSnapshot{}, nil
+}
+
func (BaseApplication) PrepareProposal(_ context.Context, req *RequestPrepareProposal) (*ResponsePrepareProposal, error) {
trs := make([]*TxRecord, 0, len(req.Txs))
var totalBytes int64
diff --git a/abci/types/messages.go b/abci/types/messages.go
index 4a749fc83a..5c058a791e 100644
--- a/abci/types/messages.go
+++ b/abci/types/messages.go
@@ -87,6 +87,12 @@ func ToRequestApplySnapshotChunk(req *RequestApplySnapshotChunk) *Request {
}
}
+func ToRequestFinalizeSnapshot(req *RequestFinalizeSnapshot) *Request {
+ return &Request{
+ Value: &Request_FinalizeSnapshot{req},
+ }
+}
+
func ToRequestExtendVote(req *RequestExtendVote) *Request {
return &Request{
Value: &Request_ExtendVote{req},
diff --git a/abci/types/mocks/application.go b/abci/types/mocks/application.go
index 1a706370d6..5e0404ee5a 100644
--- a/abci/types/mocks/application.go
+++ b/abci/types/mocks/application.go
@@ -258,6 +258,65 @@ func (_c *Application_FinalizeBlock_Call) RunAndReturn(run func(context.Context,
return _c
}
+// FinalizeSnapshot provides a mock function with given fields: _a0, _a1
+func (_m *Application) FinalizeSnapshot(_a0 context.Context, _a1 *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error) {
+ ret := _m.Called(_a0, _a1)
+
+ if len(ret) == 0 {
+ panic("no return value specified for FinalizeSnapshot")
+ }
+
+ var r0 *types.ResponseFinalizeSnapshot
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error)); ok {
+ return rf(_a0, _a1)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFinalizeSnapshot) *types.ResponseFinalizeSnapshot); ok {
+ r0 = rf(_a0, _a1)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*types.ResponseFinalizeSnapshot)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *types.RequestFinalizeSnapshot) error); ok {
+ r1 = rf(_a0, _a1)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// Application_FinalizeSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FinalizeSnapshot'
+type Application_FinalizeSnapshot_Call struct {
+ *mock.Call
+}
+
+// FinalizeSnapshot is a helper method to define mock.On call
+// - _a0 context.Context
+// - _a1 *types.RequestFinalizeSnapshot
+func (_e *Application_Expecter) FinalizeSnapshot(_a0 interface{}, _a1 interface{}) *Application_FinalizeSnapshot_Call {
+ return &Application_FinalizeSnapshot_Call{Call: _e.mock.On("FinalizeSnapshot", _a0, _a1)}
+}
+
+func (_c *Application_FinalizeSnapshot_Call) Run(run func(_a0 context.Context, _a1 *types.RequestFinalizeSnapshot)) *Application_FinalizeSnapshot_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(context.Context), args[1].(*types.RequestFinalizeSnapshot))
+ })
+ return _c
+}
+
+func (_c *Application_FinalizeSnapshot_Call) Return(_a0 *types.ResponseFinalizeSnapshot, _a1 error) *Application_FinalizeSnapshot_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *Application_FinalizeSnapshot_Call) RunAndReturn(run func(context.Context, *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error)) *Application_FinalizeSnapshot_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// Info provides a mock function with given fields: _a0, _a1
func (_m *Application) Info(_a0 context.Context, _a1 *types.RequestInfo) (*types.ResponseInfo, error) {
ret := _m.Called(_a0, _a1)
diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go
index f157a7c808..9855779aef 100644
--- a/abci/types/types.pb.go
+++ b/abci/types/types.pb.go
@@ -4485,244 +4485,245 @@ func init() {
func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) }
var fileDescriptor_252557cfdd89a31a = []byte{
- // 3779 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4b, 0x70, 0x1b, 0x47,
- 0x73, 0xc6, 0xe2, 0x8d, 0xc6, 0x6b, 0x39, 0xa4, 0x24, 0x08, 0x92, 0x48, 0xfe, 0xab, 0xf8, 0x97,
- 0x2c, 0xdb, 0xa4, 0x2d, 0xc5, 0x96, 0x1d, 0xdb, 0xa9, 0x02, 0x41, 0x28, 0x20, 0x45, 0x91, 0xf4,
- 0x12, 0xa4, 0xec, 0x38, 0xf6, 0xd6, 0x12, 0x18, 0x12, 0x6b, 0x01, 0xd8, 0xf5, 0xee, 0x82, 0x02,
- 0x7d, 0x4d, 0x52, 0x95, 0xf2, 0xc9, 0xf7, 0x94, 0x6f, 0xc9, 0x31, 0xf7, 0x9c, 0x92, 0x63, 0x9c,
- 0xca, 0xc5, 0xc7, 0x54, 0xa5, 0xa2, 0xb8, 0xe4, 0x5b, 0x6e, 0x3e, 0xe5, 0x92, 0x43, 0x6a, 0x1e,
- 0xfb, 0x04, 0x16, 0x0f, 0xcb, 0x55, 0xa9, 0xff, 0x86, 0xe9, 0xe9, 0xee, 0x9d, 0x47, 0x4f, 0x77,
- 0xcf, 0xd7, 0x03, 0xb8, 0x61, 0xe3, 0x41, 0x07, 0x9b, 0x7d, 0x6d, 0x60, 0x6f, 0xaa, 0xa7, 0x6d,
- 0x6d, 0xd3, 0xbe, 0x34, 0xb0, 0xb5, 0x61, 0x98, 0xba, 0xad, 0xa3, 0xb2, 0xd7, 0xb9, 0x41, 0x3a,
- 0xab, 0xb7, 0x7c, 0xdc, 0x6d, 0xf3, 0xd2, 0xb0, 0xf5, 0x4d, 0xc3, 0xd4, 0xf5, 0x33, 0xc6, 0x5f,
- 0xf5, 0x2b, 0xa3, 0x7a, 0x36, 0x3b, 0xaa, 0xd5, 0xe5, 0x9d, 0x37, 0xc7, 0x3a, 0x4f, 0x7b, 0x7a,
- 0xfb, 0x59, 0x64, 0xaf, 0x6f, 0x20, 0x81, 0x5e, 0xfe, 0xdd, 0x67, 0xf8, 0xd2, 0xe9, 0xbd, 0x35,
- 0x26, 0x6b, 0xa8, 0xa6, 0xda, 0x77, 0xba, 0x57, 0x7d, 0xdd, 0x17, 0xd8, 0xb4, 0x34, 0x7d, 0x10,
- 0x50, 0xbe, 0x76, 0xae, 0xeb, 0xe7, 0x3d, 0xbc, 0x49, 0x5b, 0xa7, 0xc3, 0xb3, 0x4d, 0x5b, 0xeb,
- 0x63, 0xcb, 0x56, 0xfb, 0x06, 0x67, 0x58, 0x39, 0xd7, 0xcf, 0x75, 0xfa, 0x73, 0x93, 0xfc, 0x62,
- 0x54, 0xe9, 0x45, 0x0e, 0x32, 0x32, 0xfe, 0x7a, 0x88, 0x2d, 0x1b, 0xdd, 0x87, 0x24, 0x6e, 0x77,
- 0xf5, 0x8a, 0xb0, 0x2e, 0xdc, 0xcd, 0xdf, 0xbf, 0xb9, 0x11, 0x5a, 0xb7, 0x0d, 0xce, 0xd7, 0x68,
- 0x77, 0xf5, 0x66, 0x4c, 0xa6, 0xbc, 0xe8, 0x5d, 0x48, 0x9d, 0xf5, 0x86, 0x56, 0xb7, 0x12, 0xa7,
- 0x42, 0xb7, 0xa2, 0x84, 0x1e, 0x11, 0xa6, 0x66, 0x4c, 0x66, 0xdc, 0xe4, 0x53, 0xda, 0xe0, 0x4c,
- 0xaf, 0x24, 0xa6, 0x7f, 0x6a, 0x67, 0x70, 0x46, 0x3f, 0x45, 0x78, 0xd1, 0x16, 0x80, 0x36, 0xd0,
- 0x6c, 0xa5, 0xdd, 0x55, 0xb5, 0x41, 0x25, 0x49, 0x25, 0x7f, 0x17, 0x2d, 0xa9, 0xd9, 0x75, 0xc2,
- 0xd8, 0x8c, 0xc9, 0x39, 0xcd, 0x69, 0x90, 0xe1, 0x7e, 0x3d, 0xc4, 0xe6, 0x65, 0x25, 0x35, 0x7d,
- 0xb8, 0x9f, 0x10, 0x26, 0x32, 0x5c, 0xca, 0x8d, 0x3e, 0x82, 0x6c, 0xbb, 0x8b, 0xdb, 0xcf, 0x14,
- 0x7b, 0x54, 0xc9, 0x50, 0xc9, 0xb5, 0x28, 0xc9, 0x3a, 0xe1, 0x6b, 0x8d, 0x9a, 0x31, 0x39, 0xd3,
- 0x66, 0x3f, 0xd1, 0x3e, 0x94, 0x7a, 0x9a, 0x65, 0x2b, 0xd6, 0x40, 0x35, 0xac, 0xae, 0x6e, 0x5b,
- 0x95, 0x3c, 0xd5, 0xf1, 0x5a, 0x94, 0x8e, 0x3d, 0xcd, 0xb2, 0x8f, 0x1c, 0xe6, 0x66, 0x4c, 0x2e,
- 0xf6, 0xfc, 0x04, 0xa2, 0x4f, 0x3f, 0x3b, 0xc3, 0xa6, 0xab, 0xb0, 0x52, 0x98, 0xae, 0xef, 0x80,
- 0x70, 0x3b, 0xf2, 0x44, 0x9f, 0xee, 0x27, 0xa0, 0xcf, 0x61, 0xb9, 0xa7, 0xab, 0x1d, 0x57, 0x9d,
- 0xd2, 0xee, 0x0e, 0x07, 0xcf, 0x2a, 0x45, 0xaa, 0xf4, 0xf5, 0xc8, 0x41, 0xea, 0x6a, 0xc7, 0x51,
- 0x51, 0x27, 0x02, 0xcd, 0x98, 0xbc, 0xd4, 0x0b, 0x13, 0xd1, 0x97, 0xb0, 0xa2, 0x1a, 0x46, 0xef,
- 0x32, 0xac, 0xbd, 0x44, 0xb5, 0xdf, 0x8b, 0xd2, 0x5e, 0x23, 0x32, 0x61, 0xf5, 0x48, 0x1d, 0xa3,
- 0xa2, 0xa7, 0xb0, 0x74, 0xa6, 0x0d, 0xd4, 0x9e, 0xf6, 0x0d, 0xf6, 0xd6, 0x63, 0x85, 0x2a, 0xbf,
- 0x1b, 0x69, 0x8c, 0x5c, 0xc0, 0xb7, 0x24, 0xe2, 0x59, 0x88, 0x86, 0x5a, 0x20, 0x1a, 0x26, 0x36,
- 0x54, 0x13, 0x2b, 0x86, 0xa9, 0x1b, 0xba, 0xa5, 0xf6, 0x2a, 0x65, 0xaa, 0xf7, 0x4e, 0x94, 0xde,
- 0x43, 0xc6, 0x7f, 0xc8, 0xd9, 0x9b, 0x31, 0xb9, 0x6c, 0x04, 0x49, 0x4c, 0xab, 0xde, 0xc6, 0x96,
- 0xe5, 0x69, 0x15, 0x67, 0x69, 0xa5, 0xfc, 0x41, 0xad, 0x01, 0x12, 0x6a, 0x40, 0x1e, 0x8f, 0x88,
- 0xb8, 0x72, 0xa1, 0xdb, 0xb8, 0xb2, 0x44, 0x15, 0x4a, 0x91, 0x07, 0x98, 0xb2, 0x9e, 0xe8, 0x36,
- 0x6e, 0xc6, 0x64, 0xc0, 0x6e, 0x0b, 0xa9, 0x70, 0xe5, 0x02, 0x9b, 0xda, 0xd9, 0x25, 0x55, 0xa3,
- 0xd0, 0x1e, 0xe2, 0x68, 0x2a, 0x88, 0x2a, 0x7c, 0x23, 0x4a, 0xe1, 0x09, 0x15, 0x22, 0x2a, 0x1a,
- 0x8e, 0x48, 0x33, 0x26, 0x2f, 0x5f, 0x8c, 0x93, 0x89, 0xed, 0xba, 0xdb, 0x45, 0x3d, 0x67, 0x65,
- 0x79, 0xba, 0xed, 0x3a, 0x7b, 0xb5, 0x45, 0x98, 0x89, 0xed, 0x9e, 0xf9, 0x09, 0x5b, 0x19, 0x48,
- 0x5d, 0xa8, 0xbd, 0x21, 0xde, 0x4d, 0x66, 0xd3, 0x62, 0x66, 0x37, 0x99, 0xcd, 0x8a, 0xb9, 0xdd,
- 0x64, 0x36, 0x27, 0xc2, 0x6e, 0x32, 0x0b, 0x62, 0x5e, 0xba, 0x03, 0x79, 0x9f, 0xdf, 0x42, 0x15,
- 0xc8, 0xf4, 0xb1, 0x65, 0xa9, 0xe7, 0x98, 0xba, 0xb9, 0x9c, 0xec, 0x34, 0xa5, 0x12, 0x14, 0xfc,
- 0xbe, 0x4a, 0xfa, 0x4e, 0x70, 0x25, 0x89, 0x1b, 0x22, 0x92, 0xdc, 0xef, 0x3a, 0x92, 0xbc, 0x89,
- 0x6e, 0x43, 0x91, 0x4e, 0x45, 0x71, 0xfa, 0x89, 0x2f, 0x4c, 0xca, 0x05, 0x4a, 0x3c, 0xe1, 0x4c,
- 0x6b, 0x90, 0x37, 0xee, 0x1b, 0x2e, 0x4b, 0x82, 0xb2, 0x80, 0x71, 0xdf, 0x70, 0x18, 0x7e, 0x07,
- 0x05, 0x32, 0x6f, 0x97, 0x23, 0x49, 0x3f, 0x92, 0x27, 0x34, 0xce, 0x22, 0xfd, 0x55, 0x02, 0xc4,
- 0xb0, 0x7f, 0x43, 0xef, 0x43, 0x92, 0xb8, 0x7a, 0xee, 0xb5, 0xab, 0x1b, 0x2c, 0x0e, 0x6c, 0x38,
- 0x71, 0x60, 0xa3, 0xe5, 0xc4, 0x81, 0xad, 0xec, 0x0f, 0x2f, 0xd6, 0x62, 0xdf, 0xfd, 0xd7, 0x9a,
- 0x20, 0x53, 0x09, 0x74, 0x9d, 0x78, 0x35, 0x55, 0x1b, 0x28, 0x5a, 0x87, 0x0e, 0x39, 0x47, 0x5c,
- 0x96, 0xaa, 0x0d, 0x76, 0x3a, 0x68, 0x0f, 0xc4, 0xb6, 0x3e, 0xb0, 0xf0, 0xc0, 0x1a, 0x5a, 0x0a,
- 0x8b, 0x43, 0xdc, 0x57, 0x07, 0x3c, 0x2e, 0x0b, 0x40, 0x75, 0x87, 0xf3, 0x90, 0x32, 0xca, 0xe5,
- 0x76, 0x90, 0x80, 0xf6, 0xa1, 0x78, 0xa1, 0xf6, 0xb4, 0x8e, 0x6a, 0xeb, 0xa6, 0x62, 0x61, 0x9b,
- 0x3b, 0xef, 0xdb, 0x63, 0x7b, 0x7e, 0xe2, 0x70, 0x1d, 0x61, 0xfb, 0xd8, 0xe8, 0xa8, 0x36, 0xde,
- 0x4a, 0xfe, 0xf0, 0x62, 0x4d, 0x90, 0x0b, 0x17, 0xbe, 0x1e, 0xf4, 0x7b, 0x28, 0xab, 0x86, 0xa1,
- 0x58, 0xb6, 0x6a, 0x63, 0xe5, 0xf4, 0xd2, 0xc6, 0x16, 0xf5, 0xe7, 0x05, 0xb9, 0xa8, 0x1a, 0xc6,
- 0x11, 0xa1, 0x6e, 0x11, 0x22, 0x7a, 0x0d, 0x4a, 0xc4, 0xf5, 0x6b, 0x6a, 0x4f, 0xe9, 0x62, 0xed,
- 0xbc, 0x6b, 0x57, 0xd2, 0xeb, 0xc2, 0xdd, 0x84, 0x5c, 0xe4, 0xd4, 0x26, 0x25, 0xa2, 0x0d, 0x58,
- 0x76, 0xd8, 0xda, 0xba, 0x89, 0x1d, 0x5e, 0xe2, 0xe8, 0x8b, 0xf2, 0x12, 0xef, 0xaa, 0xeb, 0x26,
- 0x66, 0xfc, 0x52, 0xc7, 0xb5, 0x14, 0x1a, 0x26, 0x10, 0x82, 0x64, 0x47, 0xb5, 0x55, 0xba, 0x03,
- 0x05, 0x99, 0xfe, 0x26, 0x34, 0x43, 0xb5, 0xbb, 0x7c, 0x5d, 0xe9, 0x6f, 0x74, 0x15, 0xd2, 0x5c,
- 0x75, 0x82, 0x0e, 0x83, 0xb7, 0xd0, 0x0a, 0xa4, 0x0c, 0x53, 0xbf, 0xc0, 0x74, 0x59, 0xb2, 0x32,
- 0x6b, 0x48, 0x32, 0x94, 0x82, 0x21, 0x05, 0x95, 0x20, 0x6e, 0x8f, 0xf8, 0x57, 0xe2, 0xf6, 0x08,
- 0xbd, 0x0d, 0x49, 0xb2, 0x01, 0xf4, 0x1b, 0xa5, 0x09, 0x41, 0x94, 0xcb, 0xb5, 0x2e, 0x0d, 0x2c,
- 0x53, 0x4e, 0xe9, 0x2a, 0xac, 0x4c, 0x0a, 0x31, 0x52, 0xd7, 0xa5, 0x07, 0x42, 0x05, 0x7a, 0x17,
- 0xb2, 0xae, 0x4f, 0x65, 0xf6, 0x75, 0x7d, 0xec, 0x2b, 0x0e, 0xb3, 0xec, 0xb2, 0x12, 0xc3, 0x22,
- 0xfb, 0xd3, 0x55, 0x79, 0x5e, 0x50, 0x90, 0x33, 0xaa, 0x61, 0x34, 0x55, 0xab, 0x2b, 0x9d, 0x43,
- 0x25, 0x2a, 0x7e, 0xf8, 0xd6, 0x47, 0xa0, 0xa7, 0xc3, 0x59, 0x1f, 0xdf, 0xc9, 0x8b, 0xd3, 0x3d,
- 0x71, 0x4f, 0x1e, 0xb5, 0xe0, 0xe1, 0xe0, 0x19, 0xb1, 0xe0, 0x04, 0xfb, 0x10, 0x6d, 0xef, 0x74,
- 0xa4, 0x0e, 0x5c, 0x8f, 0x0c, 0x25, 0x01, 0x39, 0x21, 0x20, 0x47, 0x36, 0x83, 0x05, 0x28, 0x36,
- 0x70, 0xd6, 0x20, 0x43, 0xb3, 0xe8, 0xbc, 0xe9, 0x67, 0x72, 0x32, 0x6f, 0x49, 0x9f, 0xc2, 0xb5,
- 0x88, 0x98, 0x82, 0x3e, 0x86, 0x7c, 0x8f, 0x0c, 0x9f, 0xbb, 0xb9, 0x09, 0x49, 0x15, 0x3b, 0x3d,
- 0x7b, 0x84, 0x89, 0x3a, 0x33, 0x19, 0x7a, 0xee, 0x6f, 0xe9, 0x97, 0x24, 0x5c, 0x9d, 0x1c, 0x56,
- 0xd0, 0x3a, 0x14, 0xfa, 0xea, 0x48, 0xb1, 0x47, 0xdc, 0xf6, 0x05, 0x6a, 0x4d, 0xd0, 0x57, 0x47,
- 0xad, 0x11, 0x33, 0x7c, 0x11, 0x12, 0xf6, 0xc8, 0xaa, 0xc4, 0xd7, 0x13, 0x77, 0x0b, 0x32, 0xf9,
- 0x89, 0x9e, 0xc0, 0x52, 0x4f, 0x6f, 0xab, 0x3d, 0xa5, 0xa7, 0x5a, 0xb6, 0xd2, 0xd6, 0xfb, 0x7d,
- 0xcd, 0xe6, 0x27, 0xfa, 0xc6, 0xb8, 0xe1, 0xd0, 0x6e, 0xe2, 0xf5, 0xe8, 0xf1, 0x8b, 0xc9, 0x65,
- 0x2a, 0xbb, 0xa7, 0x5a, 0x36, 0xeb, 0x42, 0xdb, 0x90, 0xef, 0x6b, 0xd6, 0x29, 0xee, 0xaa, 0x17,
- 0x9a, 0x6e, 0x56, 0x92, 0xeb, 0x89, 0x89, 0x69, 0xdc, 0x13, 0x8f, 0x87, 0x6b, 0xf2, 0x8b, 0xf9,
- 0x36, 0x3c, 0x15, 0x38, 0x10, 0x8e, 0x4b, 0x4b, 0x2f, 0xec, 0xd2, 0xde, 0x86, 0x95, 0x01, 0x1e,
- 0xd9, 0x8a, 0xeb, 0x2e, 0x2c, 0x66, 0x85, 0x19, 0xba, 0x99, 0x88, 0xf4, 0xb9, 0x3e, 0xc6, 0x22,
- 0x06, 0x49, 0xf6, 0xdb, 0xd4, 0x87, 0x83, 0x4e, 0x25, 0xbb, 0x2e, 0xdc, 0x4d, 0xc9, 0xac, 0x81,
- 0x1e, 0x42, 0x85, 0xba, 0x02, 0xe6, 0x1f, 0xc9, 0x86, 0xe0, 0x8e, 0xe3, 0x17, 0x72, 0xd4, 0x06,
- 0xaf, 0x90, 0x7e, 0xea, 0x81, 0xf7, 0x68, 0x2f, 0xf7, 0x25, 0x9b, 0xb0, 0xc2, 0xe2, 0x3a, 0x36,
- 0x49, 0x80, 0x27, 0x9b, 0x44, 0x07, 0x00, 0x74, 0x00, 0x4b, 0x4e, 0xdf, 0xa1, 0xa9, 0xb7, 0x46,
- 0xf4, 0xfb, 0x6f, 0xbb, 0x02, 0x1d, 0x85, 0x1c, 0x1a, 0xc7, 0xd2, 0xf3, 0xf4, 0x08, 0x20, 0xa7,
- 0xaf, 0x66, 0xb8, 0x81, 0xe2, 0xa1, 0x77, 0x1c, 0x0a, 0xe3, 0x59, 0x2c, 0xef, 0xf2, 0x9c, 0xb2,
- 0x77, 0x5a, 0xd6, 0x20, 0xff, 0xf5, 0x50, 0x37, 0x87, 0x7d, 0x36, 0xa4, 0x22, 0x1d, 0x12, 0x30,
- 0x12, 0x3d, 0x9c, 0xff, 0x9c, 0xf2, 0xd9, 0x5c, 0x30, 0xc3, 0xe0, 0x16, 0x25, 0x78, 0x16, 0x75,
- 0xe4, 0x1b, 0xb8, 0xdf, 0xa8, 0xe2, 0xf3, 0x1a, 0x95, 0x3b, 0xb7, 0x68, 0xbb, 0x4a, 0xfc, 0x3a,
- 0xbb, 0x42, 0x90, 0xa4, 0x33, 0x4c, 0x32, 0x87, 0x4c, 0x7e, 0x47, 0xda, 0x9a, 0xbb, 0xff, 0x69,
- 0xff, 0xfe, 0x3b, 0x16, 0x98, 0xf9, 0xcd, 0x2c, 0x30, 0x1b, 0x69, 0x81, 0xbf, 0xda, 0xd6, 0x5a,
- 0x70, 0x35, 0x24, 0xa8, 0x0c, 0x69, 0xd0, 0xa4, 0xd6, 0x16, 0xba, 0xa3, 0x38, 0xa1, 0xda, 0xa7,
- 0x48, 0x5e, 0x0e, 0xe8, 0x65, 0x01, 0x37, 0xd2, 0x82, 0xf3, 0x8b, 0x5a, 0x70, 0x61, 0x1e, 0x0b,
- 0x2e, 0xbe, 0x8a, 0x05, 0x97, 0xc6, 0x2c, 0xf8, 0x18, 0x96, 0xc6, 0x92, 0x5c, 0xd7, 0x1c, 0x84,
- 0x89, 0xe6, 0x10, 0x9f, 0x6c, 0x0e, 0x09, 0x9f, 0x39, 0x48, 0x3f, 0x09, 0x50, 0x8d, 0xce, 0x75,
- 0x27, 0x7e, 0xe0, 0x1d, 0xb8, 0xe2, 0xe5, 0x3c, 0xfe, 0x75, 0x64, 0x71, 0x05, 0xb9, 0x9d, 0xde,
- 0x42, 0x4e, 0xc9, 0x0f, 0xd8, 0x98, 0x92, 0x7e, 0x13, 0x7d, 0x02, 0xe5, 0x60, 0x96, 0x4e, 0x92,
- 0x20, 0x72, 0x5c, 0xfe, 0x68, 0xec, 0xb8, 0x78, 0x6b, 0xe1, 0x8e, 0x59, 0x2e, 0x5d, 0xf8, 0x9b,
- 0x96, 0xf4, 0x6f, 0x71, 0x37, 0x07, 0x08, 0xa4, 0xdc, 0xe8, 0x03, 0x48, 0xf3, 0x93, 0x2d, 0xcc,
- 0x7b, 0xb2, 0xb9, 0x40, 0xf8, 0x34, 0xc7, 0x5f, 0xed, 0x34, 0x27, 0x26, 0x6e, 0x5f, 0x72, 0xf2,
- 0x52, 0xa5, 0xfc, 0x4b, 0xf5, 0x16, 0xa4, 0x58, 0x10, 0x66, 0x01, 0xe5, 0xda, 0xf8, 0xb9, 0x60,
- 0xf1, 0x97, 0x71, 0xa1, 0x1a, 0x64, 0x59, 0x3e, 0xaf, 0x75, 0xb8, 0x03, 0xb8, 0x1e, 0x21, 0xb1,
- 0xb3, 0xbd, 0x95, 0x7f, 0xf9, 0x62, 0x2d, 0xc3, 0x1b, 0x72, 0x86, 0xca, 0xed, 0x74, 0xa4, 0xbf,
- 0x05, 0xc8, 0xca, 0xd8, 0x32, 0x88, 0x09, 0xa3, 0x2d, 0xc8, 0xe1, 0x51, 0x1b, 0x1b, 0xb6, 0x73,
- 0x77, 0x98, 0x7c, 0x37, 0x63, 0xdc, 0x0d, 0x87, 0xb3, 0x19, 0x93, 0x3d, 0x31, 0xf4, 0x80, 0x63,
- 0x33, 0xd1, 0x30, 0x0b, 0x17, 0xf7, 0x83, 0x33, 0xef, 0x39, 0xe0, 0x0c, 0x0b, 0xf4, 0xab, 0x91,
- 0x52, 0x21, 0x74, 0xe6, 0x01, 0x47, 0x67, 0x92, 0x33, 0x3e, 0x16, 0x80, 0x67, 0xea, 0x01, 0x78,
- 0x26, 0x35, 0x63, 0x9a, 0x11, 0xf8, 0xcc, 0x7b, 0x0e, 0x3e, 0x93, 0x9e, 0x31, 0xe2, 0x10, 0x40,
- 0xf3, 0xf1, 0x18, 0x40, 0xb3, 0x1e, 0x29, 0x3a, 0x01, 0xa1, 0x39, 0x18, 0x43, 0x68, 0xb2, 0x54,
- 0xc9, 0xef, 0x23, 0x95, 0xcc, 0x80, 0x68, 0x0e, 0xc6, 0x20, 0x9a, 0xdc, 0x0c, 0x85, 0x33, 0x30,
- 0x9a, 0xbf, 0x98, 0x8c, 0xd1, 0x40, 0x24, 0x8a, 0xc2, 0x87, 0x39, 0x1f, 0x48, 0xa3, 0x44, 0x80,
- 0x34, 0xf9, 0xc8, 0x7b, 0x3f, 0x53, 0x3f, 0x37, 0x4a, 0xf3, 0xe9, 0x24, 0x94, 0x66, 0x29, 0x12,
- 0x60, 0xe2, 0x56, 0x39, 0x0f, 0x4c, 0x73, 0x3c, 0x01, 0xa6, 0x29, 0x44, 0xc2, 0x3f, 0x4c, 0xf1,
- 0x1c, 0x38, 0xcd, 0xf1, 0x04, 0x9c, 0xa6, 0x38, 0x53, 0xed, 0x4c, 0xa0, 0xe6, 0x51, 0x10, 0xa8,
- 0x29, 0x45, 0xdc, 0x83, 0x3d, 0x67, 0x10, 0x81, 0xd4, 0x9c, 0x46, 0x21, 0x35, 0x0c, 0xa1, 0x7a,
- 0x33, 0x52, 0xe3, 0x02, 0x50, 0xcd, 0xc1, 0x18, 0x54, 0x23, 0xce, 0xb0, 0xe1, 0x39, 0xb1, 0x1a,
- 0xe9, 0x75, 0x12, 0xa5, 0x43, 0xee, 0x8e, 0xb8, 0x6e, 0x6c, 0x9a, 0xba, 0xc9, 0xd1, 0x15, 0xd6,
- 0x90, 0xee, 0x92, 0xbb, 0xb6, 0xe7, 0xda, 0xa6, 0xe0, 0x37, 0x65, 0x28, 0x06, 0xdc, 0x99, 0xf4,
- 0x8f, 0x82, 0x27, 0x4b, 0x11, 0x1c, 0xff, 0x3d, 0x3d, 0xc7, 0xef, 0xe9, 0xa1, 0xbb, 0x65, 0x2e,
- 0x90, 0x6b, 0xf8, 0xb3, 0x19, 0x0e, 0xd8, 0xa8, 0x5e, 0x16, 0x73, 0x0f, 0x96, 0x68, 0xde, 0xcb,
- 0x62, 0x45, 0x20, 0x1c, 0x95, 0x49, 0x07, 0x5b, 0x05, 0x16, 0x97, 0xde, 0x82, 0x65, 0x1f, 0xaf,
- 0x7b, 0x39, 0x66, 0xa8, 0x85, 0xe8, 0x72, 0xd7, 0xf8, 0x2d, 0xf9, 0x5f, 0x12, 0xde, 0x0a, 0x79,
- 0x48, 0xcf, 0x24, 0x50, 0x46, 0xf8, 0xd5, 0xa0, 0x4c, 0xf4, 0x25, 0x1d, 0x7d, 0x0e, 0x2b, 0x01,
- 0xbc, 0xc6, 0x49, 0x2b, 0x13, 0x8b, 0xc1, 0x36, 0x31, 0x5f, 0x96, 0xe3, 0xf6, 0xa0, 0x2f, 0xe0,
- 0x06, 0x4d, 0x90, 0x23, 0x52, 0xd7, 0xe4, 0x7c, 0xa9, 0xeb, 0x35, 0xa2, 0xa3, 0x3e, 0x21, 0x7d,
- 0x8d, 0x00, 0x73, 0x52, 0x11, 0x60, 0x0e, 0xda, 0x83, 0xc2, 0x39, 0x1e, 0x60, 0x4b, 0xb3, 0x94,
- 0x05, 0xee, 0x9c, 0x02, 0xc9, 0xf8, 0x9b, 0x31, 0x39, 0xcf, 0x65, 0x49, 0xef, 0xdf, 0x08, 0xc2,
- 0x56, 0x19, 0x8a, 0x8a, 0x5f, 0x9d, 0xf4, 0x3f, 0x82, 0x67, 0x96, 0x2e, 0x5a, 0xd4, 0xd6, 0x3b,
- 0xcc, 0x7c, 0x8b, 0x32, 0xfd, 0x4d, 0x6e, 0x57, 0x3d, 0xfd, 0x9c, 0x5b, 0x20, 0xf9, 0x49, 0xb8,
- 0xdc, 0x02, 0x49, 0x8e, 0x47, 0xd8, 0x15, 0x48, 0x69, 0x83, 0x0e, 0x1e, 0x71, 0x23, 0x63, 0x0d,
- 0x22, 0xfb, 0x0c, 0x5f, 0x72, 0x53, 0x22, 0x3f, 0x09, 0x1f, 0x3d, 0x67, 0x74, 0x2e, 0x05, 0x99,
- 0x35, 0xd0, 0xfb, 0x90, 0xa3, 0x55, 0x2e, 0x45, 0x37, 0x2c, 0x1e, 0x23, 0x03, 0xa9, 0x1c, 0xab,
- 0x48, 0x6d, 0x1c, 0x12, 0x9e, 0x03, 0xc3, 0x92, 0xb3, 0x06, 0xff, 0xe5, 0x4b, 0xb6, 0xb2, 0x81,
- 0x64, 0xeb, 0x26, 0xe4, 0xc8, 0xe8, 0x2d, 0x43, 0x6d, 0x63, 0x1a, 0xdf, 0x72, 0xb2, 0x47, 0x90,
- 0xfe, 0x49, 0x80, 0x72, 0x28, 0xe4, 0x4e, 0x9c, 0xbb, 0x73, 0x2a, 0xe3, 0x41, 0xf4, 0x6c, 0x6c,
- 0xf6, 0xb7, 0x00, 0xce, 0x55, 0x4b, 0x79, 0xae, 0x0e, 0x6c, 0xdc, 0xe1, 0x4b, 0x90, 0x3b, 0x57,
- 0xad, 0xa7, 0x94, 0x10, 0x1c, 0x4c, 0x2a, 0x34, 0x18, 0x1f, 0x7e, 0x93, 0xf6, 0xe3, 0x37, 0xa8,
- 0x0a, 0x59, 0xc3, 0xd4, 0x74, 0x53, 0xb3, 0x2f, 0xe9, 0x9a, 0x24, 0x64, 0xb7, 0x2d, 0x1d, 0xc2,
- 0x95, 0x89, 0xd1, 0x1e, 0x3d, 0x84, 0x9c, 0x97, 0x28, 0x08, 0x34, 0xa9, 0x9d, 0x02, 0x8b, 0x79,
- 0xbc, 0x64, 0x49, 0xae, 0x4c, 0x8c, 0xf7, 0xa8, 0x01, 0x69, 0x13, 0x5b, 0xc3, 0x1e, 0x4b, 0xb2,
- 0x4b, 0xf7, 0xdf, 0x9a, 0x2f, 0x4f, 0x20, 0xd4, 0x61, 0xcf, 0x96, 0xb9, 0xb0, 0xf4, 0x25, 0xa4,
- 0x19, 0x05, 0xe5, 0x21, 0x73, 0xbc, 0xff, 0x78, 0xff, 0xe0, 0xe9, 0xbe, 0x18, 0x43, 0x00, 0xe9,
- 0x5a, 0xbd, 0xde, 0x38, 0x6c, 0x89, 0x02, 0xca, 0x41, 0xaa, 0xb6, 0x75, 0x20, 0xb7, 0xc4, 0x38,
- 0x21, 0xcb, 0x8d, 0xdd, 0x46, 0xbd, 0x25, 0x26, 0xd0, 0x12, 0x14, 0xd9, 0x6f, 0xe5, 0xd1, 0x81,
- 0xfc, 0xa4, 0xd6, 0x12, 0x93, 0x3e, 0xd2, 0x51, 0x63, 0x7f, 0xbb, 0x21, 0x8b, 0x29, 0xe9, 0x1d,
- 0xb8, 0x1e, 0x99, 0x59, 0x78, 0xc8, 0x99, 0xe0, 0x43, 0xce, 0xa4, 0x1f, 0xe3, 0xe4, 0xea, 0x14,
- 0x95, 0x2e, 0xa0, 0xdd, 0xd0, 0xc4, 0xef, 0x2f, 0x90, 0x6b, 0x84, 0x66, 0x8f, 0x5e, 0x83, 0x92,
- 0x89, 0xcf, 0xb0, 0xdd, 0xee, 0xb2, 0xf4, 0xc5, 0x01, 0xc0, 0x8a, 0x9c, 0x4a, 0x85, 0x2c, 0xc6,
- 0xf6, 0x15, 0x6e, 0xdb, 0x0a, 0x33, 0x02, 0x8b, 0xc2, 0x0c, 0x39, 0xc2, 0x46, 0xa8, 0x47, 0x8c,
- 0x48, 0xfc, 0x3f, 0xf3, 0x53, 0x4c, 0x55, 0x92, 0xaa, 0x02, 0xea, 0x76, 0x28, 0x45, 0x7a, 0xbe,
- 0xd0, 0x62, 0xe7, 0x20, 0x25, 0x37, 0x5a, 0xf2, 0x67, 0x62, 0x02, 0x21, 0x28, 0xd1, 0x9f, 0xca,
- 0xd1, 0x7e, 0xed, 0xf0, 0xa8, 0x79, 0x40, 0x16, 0x7b, 0x19, 0xca, 0xce, 0x62, 0x3b, 0xc4, 0x14,
- 0xba, 0x02, 0x4b, 0xf5, 0x83, 0x27, 0x87, 0x7b, 0x8d, 0x56, 0xc3, 0x23, 0xa7, 0xa5, 0x2a, 0x54,
- 0xa2, 0x52, 0x24, 0xe9, 0x3f, 0x12, 0x70, 0x2d, 0x22, 0xcd, 0x41, 0xef, 0x03, 0xd8, 0x23, 0xc5,
- 0xc4, 0x6d, 0xdd, 0xec, 0x44, 0x1b, 0x6e, 0x6b, 0x24, 0x53, 0x0e, 0x39, 0x67, 0xf3, 0x5f, 0x53,
- 0x63, 0xc5, 0x47, 0x5c, 0x29, 0x59, 0x08, 0x8b, 0x03, 0x36, 0xb7, 0x26, 0xdc, 0x40, 0x71, 0x9b,
- 0x28, 0xa6, 0xfb, 0x45, 0x15, 0x53, 0x7e, 0xf4, 0x19, 0x5c, 0x0b, 0x85, 0x34, 0x1e, 0x07, 0xac,
- 0x49, 0x05, 0xde, 0xc9, 0x91, 0xed, 0x4a, 0x30, 0xb2, 0xb1, 0x38, 0x60, 0x4d, 0x41, 0x47, 0x52,
- 0xaf, 0x80, 0x8e, 0x44, 0x85, 0xc6, 0xf4, 0xa2, 0x15, 0x8d, 0x49, 0xa1, 0x31, 0x94, 0x72, 0x64,
- 0xc2, 0x29, 0x87, 0xf4, 0xbf, 0x81, 0xdd, 0x0d, 0xa6, 0x96, 0x07, 0x90, 0xb6, 0x6c, 0xd5, 0x1e,
- 0x5a, 0xfc, 0x24, 0x3d, 0x9c, 0x37, 0x4f, 0xdd, 0x70, 0x7e, 0x1c, 0x51, 0x71, 0x99, 0xab, 0xf9,
- 0x83, 0xdc, 0xf4, 0xa8, 0xed, 0x49, 0xfd, 0x16, 0xdb, 0xd3, 0x84, 0x34, 0xbe, 0xc0, 0x03, 0xdb,
- 0xaa, 0xa4, 0xe9, 0x8c, 0xaf, 0x8e, 0xcf, 0x98, 0x74, 0x6f, 0x55, 0x48, 0xee, 0xf3, 0xdf, 0x2f,
- 0xd6, 0x44, 0xc6, 0xfd, 0xa6, 0xde, 0xd7, 0x6c, 0xdc, 0x37, 0xec, 0x4b, 0x99, 0xcb, 0x4b, 0xef,
- 0x42, 0x29, 0xb8, 0xe8, 0xd1, 0x2e, 0xc4, 0x73, 0xd2, 0x71, 0xe9, 0x1f, 0x04, 0x58, 0x9e, 0x80,
- 0xe5, 0xa0, 0x87, 0xbc, 0x10, 0xc4, 0x36, 0xfe, 0xf6, 0xf8, 0xea, 0x05, 0xd8, 0xbd, 0x7a, 0x10,
- 0x09, 0x9a, 0xde, 0xd5, 0x81, 0xed, 0xb1, 0x47, 0x40, 0x6f, 0x40, 0xd9, 0xd2, 0xce, 0x07, 0x8a,
- 0xc9, 0x60, 0x21, 0xb7, 0xc8, 0x42, 0x32, 0x7b, 0xd2, 0xe1, 0x94, 0x22, 0x3b, 0x24, 0xf3, 0x41,
- 0x20, 0x2a, 0x21, 0x6e, 0xa9, 0x0d, 0x68, 0xfc, 0x26, 0x33, 0x09, 0xb8, 0x12, 0x5e, 0x01, 0xb8,
- 0xfa, 0x7b, 0x01, 0x6e, 0x4c, 0xb9, 0xdd, 0xa0, 0x4f, 0x42, 0xe7, 0xe2, 0x83, 0x45, 0xee, 0x46,
- 0x1b, 0x8c, 0x16, 0x3c, 0x19, 0xd2, 0x03, 0x28, 0xf8, 0xe9, 0xf3, 0x6d, 0xde, 0xae, 0x17, 0xfb,
- 0x83, 0x00, 0xdb, 0x6d, 0x28, 0x9a, 0xd8, 0x26, 0x4e, 0x2a, 0x80, 0x48, 0x16, 0x18, 0x91, 0xa5,
- 0xa9, 0xbb, 0xc9, 0xac, 0x20, 0xc6, 0x5d, 0xfb, 0xf9, 0x57, 0x01, 0xc0, 0x43, 0xdd, 0x3c, 0xd4,
- 0x4b, 0xf0, 0xa3, 0x5e, 0x21, 0xb0, 0x34, 0x1e, 0x06, 0x4b, 0xd1, 0x1d, 0x28, 0xb3, 0xfb, 0x08,
- 0xd9, 0x37, 0xd5, 0x1e, 0x9a, 0x98, 0x63, 0x6c, 0x25, 0x4a, 0x3e, 0x72, 0xa8, 0xe8, 0x73, 0xb8,
- 0x6e, 0x77, 0x4d, 0x6c, 0x75, 0xf5, 0x5e, 0x47, 0x09, 0xef, 0x1d, 0xab, 0xfd, 0xac, 0xcd, 0x30,
- 0x3a, 0xf9, 0x9a, 0xab, 0xe1, 0x24, 0xb8, 0x7f, 0xdf, 0x40, 0x8a, 0x1e, 0x1b, 0x92, 0xf4, 0xb9,
- 0x56, 0x9c, 0xe3, 0x06, 0xfa, 0x05, 0x80, 0x6a, 0xdb, 0xa6, 0x76, 0x3a, 0x24, 0xde, 0x21, 0x3e,
- 0xfe, 0x29, 0xef, 0xd8, 0xd5, 0x1c, 0xbe, 0xad, 0x9b, 0xfc, 0xfc, 0xad, 0x78, 0xa2, 0xbe, 0x33,
- 0xe8, 0x53, 0x28, 0xed, 0x43, 0x29, 0x28, 0xeb, 0x64, 0xd3, 0x6c, 0x0c, 0xc1, 0x6c, 0x9a, 0x65,
- 0xe7, 0x3c, 0x9b, 0x76, 0x73, 0xf1, 0x04, 0xab, 0xd9, 0xd2, 0x86, 0xf4, 0x8b, 0x00, 0x05, 0xbf,
- 0xd7, 0x9b, 0x3b, 0xe1, 0xe5, 0x17, 0x80, 0xc4, 0xf8, 0x05, 0x20, 0xe9, 0x4b, 0x81, 0xaf, 0x43,
- 0x96, 0xa4, 0xc0, 0x43, 0x0b, 0x77, 0x78, 0x25, 0x3b, 0x73, 0xae, 0x5a, 0xc7, 0x16, 0xee, 0xf8,
- 0x7c, 0x53, 0xe6, 0xd5, 0x7c, 0x53, 0x30, 0x91, 0xce, 0x86, 0x12, 0xe9, 0xdd, 0x64, 0x36, 0x25,
- 0xa6, 0x65, 0x5f, 0x26, 0x2e, 0xfd, 0xb5, 0x00, 0x59, 0x77, 0xbe, 0xc1, 0x12, 0x6e, 0x00, 0x97,
- 0x65, 0xcb, 0xc5, 0x0a, 0xb8, 0xfc, 0xea, 0xc2, 0x0a, 0xda, 0x09, 0xb7, 0xa0, 0xfd, 0xa1, 0x9b,
- 0x0c, 0x46, 0x21, 0x8f, 0xfe, 0xc5, 0x75, 0xc0, 0x66, 0x9e, 0xfb, 0xfe, 0x1d, 0x1f, 0x07, 0xc9,
- 0x58, 0xd0, 0x9f, 0x40, 0x5a, 0x6d, 0xbb, 0x78, 0x6b, 0x69, 0x02, 0x10, 0xe9, 0xb0, 0x6e, 0xb4,
- 0x46, 0x35, 0xca, 0x29, 0x73, 0x09, 0x3e, 0xaa, 0xb8, 0x33, 0x2a, 0x69, 0x8f, 0xe8, 0x65, 0x3c,
- 0xc1, 0x93, 0x5e, 0x02, 0x38, 0xde, 0x7f, 0x72, 0xb0, 0xbd, 0xf3, 0x68, 0xa7, 0xb1, 0xcd, 0xb3,
- 0xbd, 0xed, 0xed, 0xc6, 0xb6, 0x18, 0x27, 0x7c, 0x72, 0xe3, 0xc9, 0xc1, 0x49, 0x63, 0x5b, 0x4c,
- 0x90, 0xc6, 0x76, 0x63, 0xaf, 0xf6, 0x59, 0x63, 0x5b, 0x4c, 0x4a, 0x35, 0xc8, 0xb9, 0x41, 0x87,
- 0x56, 0xfe, 0xf5, 0xe7, 0xd8, 0xe4, 0xab, 0xc5, 0x1a, 0x68, 0x15, 0xf2, 0xe3, 0x05, 0x03, 0x72,
- 0x79, 0x63, 0x75, 0x02, 0x12, 0x06, 0xca, 0xae, 0x0e, 0x1e, 0x9b, 0x3e, 0x84, 0x8c, 0x31, 0x3c,
- 0x55, 0x1c, 0xdb, 0x0d, 0xc1, 0xec, 0xce, 0xdd, 0x6e, 0x78, 0xda, 0xd3, 0xda, 0x8f, 0xf1, 0x25,
- 0x0f, 0x72, 0x69, 0x63, 0x78, 0xfa, 0x98, 0x99, 0x38, 0x1b, 0x46, 0x7c, 0xca, 0x30, 0x12, 0xa1,
- 0x61, 0xa0, 0x3b, 0x50, 0x18, 0xe8, 0x1d, 0xac, 0xa8, 0x9d, 0x8e, 0x89, 0x2d, 0x16, 0xbb, 0x73,
- 0x5c, 0x73, 0x9e, 0xf4, 0xd4, 0x58, 0x87, 0xf4, 0x93, 0x00, 0x68, 0x3c, 0xd0, 0xa2, 0x23, 0x58,
- 0xf2, 0x62, 0xb5, 0x93, 0x00, 0xb0, 0x48, 0xb0, 0x1e, 0x1d, 0xa8, 0x03, 0xf8, 0x82, 0x78, 0x11,
- 0x24, 0x93, 0xac, 0x6f, 0xc5, 0x73, 0x55, 0x06, 0x9d, 0x2f, 0x5d, 0x94, 0xf8, 0x9c, 0x8b, 0x12,
- 0x93, 0x91, 0x2b, 0xef, 0xf6, 0x84, 0x5d, 0x69, 0x62, 0xac, 0xee, 0x64, 0x40, 0xa5, 0x35, 0x26,
- 0xc6, 0xe7, 0x19, 0x35, 0x24, 0xe1, 0x55, 0x86, 0x24, 0x3d, 0x00, 0xf1, 0x13, 0xf7, 0xfb, 0x5e,
- 0xfe, 0xe8, 0x1f, 0xa6, 0x30, 0x36, 0xcc, 0x0b, 0xc8, 0x12, 0xef, 0x4b, 0x83, 0xc6, 0x9f, 0x42,
- 0xce, 0x5d, 0x3d, 0xf7, 0xf1, 0x50, 0xe4, 0xb2, 0xf3, 0x91, 0x78, 0x22, 0xe8, 0x1e, 0x2c, 0x91,
- 0xb8, 0xe1, 0x54, 0x7f, 0x19, 0x42, 0x18, 0xa7, 0xde, 0xb0, 0xcc, 0x3a, 0xf6, 0x1c, 0x58, 0x8b,
- 0xc4, 0x68, 0x91, 0xc5, 0x72, 0xdc, 0xf9, 0xff, 0x18, 0x00, 0xb9, 0xf3, 0x85, 0x80, 0x52, 0xb6,
- 0x87, 0xc5, 0x40, 0x32, 0x21, 0xfd, 0x65, 0x1c, 0xf2, 0xbe, 0x6a, 0x14, 0xfa, 0xe3, 0x40, 0x62,
- 0xb5, 0x3e, 0xad, 0x72, 0xe5, 0xcb, 0xaa, 0x02, 0x13, 0x8b, 0x2f, 0x3e, 0xb1, 0xa8, 0x3a, 0xa0,
- 0x53, 0x94, 0x4e, 0x2e, 0x5c, 0x94, 0x7e, 0x13, 0x90, 0xad, 0xdb, 0x6a, 0x8f, 0x04, 0x6f, 0x6d,
- 0x70, 0xae, 0xb0, 0xd3, 0xce, 0x0a, 0xe1, 0x22, 0xed, 0x39, 0xa1, 0x1d, 0x87, 0x84, 0x2e, 0xf5,
- 0x20, 0xeb, 0x02, 0x13, 0x8b, 0xbf, 0xc9, 0x99, 0x54, 0x7c, 0xaf, 0x42, 0xb6, 0x8f, 0x6d, 0x95,
- 0x86, 0x3d, 0x06, 0x54, 0xb9, 0xed, 0x7b, 0x1f, 0x40, 0xde, 0xf7, 0x50, 0x89, 0x44, 0xc2, 0xfd,
- 0xc6, 0x53, 0x31, 0x56, 0xcd, 0x7c, 0xfb, 0xfd, 0x7a, 0x62, 0x1f, 0x3f, 0x27, 0x9f, 0x92, 0x1b,
- 0xf5, 0x66, 0xa3, 0xfe, 0x58, 0x14, 0xaa, 0xf9, 0x6f, 0xbf, 0x5f, 0xcf, 0xc8, 0x98, 0x16, 0x6e,
- 0xee, 0x3d, 0x86, 0x72, 0x68, 0x07, 0x82, 0x0e, 0x1a, 0x41, 0x69, 0xfb, 0xf8, 0x70, 0x6f, 0xa7,
- 0x5e, 0x6b, 0x35, 0x94, 0x93, 0x83, 0x56, 0x43, 0x14, 0xd0, 0x35, 0x58, 0xde, 0xdb, 0xf9, 0xb3,
- 0x66, 0x4b, 0xa9, 0xef, 0xed, 0x34, 0xf6, 0x5b, 0x4a, 0xad, 0xd5, 0xaa, 0xd5, 0x1f, 0x8b, 0xf1,
- 0xfb, 0xff, 0x09, 0x50, 0xae, 0x6d, 0xd5, 0x77, 0x6a, 0x86, 0xd1, 0xd3, 0xda, 0x2a, 0x75, 0xf7,
- 0x75, 0x48, 0x52, 0xd4, 0x79, 0xea, 0x5b, 0xe8, 0xea, 0xf4, 0x6a, 0x1c, 0x7a, 0x04, 0x29, 0x0a,
- 0x48, 0xa3, 0xe9, 0x8f, 0xa3, 0xab, 0x33, 0xca, 0x73, 0x64, 0x30, 0xf4, 0xdc, 0x4c, 0x7d, 0x2d,
- 0x5d, 0x9d, 0x5e, 0xad, 0x43, 0x7b, 0x90, 0x71, 0xc0, 0xb8, 0x59, 0x4f, 0x98, 0xab, 0x33, 0x4b,
- 0x68, 0x64, 0x6a, 0x0c, 0xd4, 0x9c, 0xfe, 0x90, 0xba, 0x3a, 0xa3, 0x8e, 0x87, 0x64, 0xc8, 0x79,
- 0x30, 0xf7, 0xec, 0x37, 0xdd, 0xd5, 0x39, 0xea, 0x8a, 0xe8, 0x4b, 0x28, 0x06, 0x61, 0xbb, 0xf9,
- 0x9e, 0x5b, 0x57, 0xe7, 0xac, 0xf9, 0x11, 0xfd, 0x41, 0x0c, 0x6f, 0xbe, 0xe7, 0xd7, 0xd5, 0x39,
- 0x4b, 0x80, 0xe8, 0x2b, 0x58, 0x1a, 0xc7, 0xd8, 0xe6, 0x7f, 0x8d, 0x5d, 0x5d, 0xa0, 0x28, 0x88,
- 0xfa, 0x80, 0x26, 0x60, 0x73, 0x0b, 0x3c, 0xce, 0xae, 0x2e, 0x52, 0x23, 0x44, 0x1d, 0x28, 0x87,
- 0xb1, 0xa9, 0x79, 0xdf, 0x54, 0x57, 0xe7, 0xae, 0xea, 0xb1, 0xaf, 0x04, 0x31, 0x92, 0x79, 0xdf,
- 0x58, 0x57, 0xe7, 0x2e, 0xf2, 0xa1, 0x63, 0x00, 0xdf, 0xdd, 0x76, 0x8e, 0x37, 0xd7, 0xd5, 0x79,
- 0xca, 0x7d, 0xc8, 0x80, 0xe5, 0x49, 0x97, 0xd9, 0x45, 0x9e, 0x60, 0x57, 0x17, 0xaa, 0x02, 0x12,
- 0x7b, 0x0e, 0xde, 0x4b, 0xe7, 0x7b, 0x92, 0x5d, 0x9d, 0xb3, 0x1c, 0xb8, 0xb5, 0xf5, 0xc3, 0xcb,
- 0x55, 0xe1, 0xc7, 0x97, 0xab, 0xc2, 0x4f, 0x2f, 0x57, 0x85, 0xef, 0x7e, 0x5e, 0x8d, 0xfd, 0xf8,
- 0xf3, 0x6a, 0xec, 0xdf, 0x7f, 0x5e, 0x8d, 0xfd, 0xf9, 0xdd, 0x73, 0xcd, 0xee, 0x0e, 0x4f, 0x37,
- 0xda, 0x7a, 0x9f, 0xfe, 0xd5, 0xc6, 0x50, 0x2f, 0x37, 0x99, 0x4e, 0xd2, 0xf2, 0xfd, 0xa1, 0xe7,
- 0x34, 0x4d, 0x63, 0xdd, 0x83, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x98, 0x78, 0x79, 0x4b, 0xf0,
- 0x33, 0x00, 0x00,
+ // 3796 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4d, 0x70, 0x1b, 0x57,
+ 0x72, 0xc6, 0xe0, 0x1f, 0x8d, 0xbf, 0xe1, 0x23, 0x25, 0x41, 0x90, 0x44, 0x72, 0x47, 0xf1, 0x4a,
+ 0xab, 0xb5, 0x49, 0xaf, 0x14, 0xaf, 0xec, 0xec, 0x6e, 0xaa, 0x40, 0x10, 0x0a, 0x48, 0x51, 0x24,
+ 0x3d, 0x04, 0xa9, 0x75, 0x1c, 0x7b, 0x6a, 0x08, 0x3c, 0x02, 0x63, 0x01, 0x98, 0xf1, 0xcc, 0x80,
+ 0x02, 0x7d, 0x4d, 0x52, 0x95, 0xf2, 0xc9, 0xf7, 0x94, 0x6f, 0xc9, 0x31, 0xf7, 0x9c, 0x92, 0x5b,
+ 0xe2, 0x54, 0x2e, 0x3e, 0xa6, 0x2a, 0x55, 0x8a, 0x4b, 0xbe, 0xe5, 0xe6, 0x53, 0x2e, 0x39, 0xa4,
+ 0xde, 0xcf, 0xfc, 0x02, 0x83, 0x1f, 0xcb, 0x55, 0xa9, 0xbd, 0xe1, 0xf5, 0xeb, 0xee, 0x79, 0x3f,
+ 0xfd, 0xba, 0xfb, 0x7d, 0xfd, 0x00, 0xb7, 0x6c, 0x3c, 0xec, 0x60, 0x73, 0xa0, 0x0d, 0xed, 0x6d,
+ 0xf5, 0xbc, 0xad, 0x6d, 0xdb, 0x57, 0x06, 0xb6, 0xb6, 0x0c, 0x53, 0xb7, 0x75, 0x54, 0xf6, 0x3a,
+ 0xb7, 0x48, 0x67, 0xf5, 0x8e, 0x8f, 0xbb, 0x6d, 0x5e, 0x19, 0xb6, 0xbe, 0x6d, 0x98, 0xba, 0x7e,
+ 0xc1, 0xf8, 0xab, 0x7e, 0x65, 0x54, 0xcf, 0x76, 0x47, 0xb5, 0x7a, 0xbc, 0xf3, 0xf6, 0x44, 0xe7,
+ 0x79, 0x5f, 0x6f, 0xbf, 0x88, 0xec, 0xf5, 0x0d, 0x24, 0xd0, 0xcb, 0xbf, 0xfb, 0x02, 0x5f, 0x39,
+ 0xbd, 0x77, 0x26, 0x64, 0x0d, 0xd5, 0x54, 0x07, 0x4e, 0xf7, 0xba, 0xaf, 0xfb, 0x12, 0x9b, 0x96,
+ 0xa6, 0x0f, 0x03, 0xca, 0x37, 0xba, 0xba, 0xde, 0xed, 0xe3, 0x6d, 0xda, 0x3a, 0x1f, 0x5d, 0x6c,
+ 0xdb, 0xda, 0x00, 0x5b, 0xb6, 0x3a, 0x30, 0x38, 0xc3, 0x5a, 0x57, 0xef, 0xea, 0xf4, 0xe7, 0x36,
+ 0xf9, 0xc5, 0xa8, 0xd2, 0xab, 0x1c, 0x64, 0x64, 0xfc, 0xf9, 0x08, 0x5b, 0x36, 0x7a, 0x08, 0x49,
+ 0xdc, 0xee, 0xe9, 0x15, 0x61, 0x53, 0xb8, 0x9f, 0x7f, 0x78, 0x7b, 0x2b, 0xb4, 0x6e, 0x5b, 0x9c,
+ 0xaf, 0xd1, 0xee, 0xe9, 0xcd, 0x98, 0x4c, 0x79, 0xd1, 0x7b, 0x90, 0xba, 0xe8, 0x8f, 0xac, 0x5e,
+ 0x25, 0x4e, 0x85, 0xee, 0x44, 0x09, 0x3d, 0x21, 0x4c, 0xcd, 0x98, 0xcc, 0xb8, 0xc9, 0xa7, 0xb4,
+ 0xe1, 0x85, 0x5e, 0x49, 0xcc, 0xfe, 0xd4, 0xde, 0xf0, 0x82, 0x7e, 0x8a, 0xf0, 0xa2, 0x1d, 0x00,
+ 0x6d, 0xa8, 0xd9, 0x4a, 0xbb, 0xa7, 0x6a, 0xc3, 0x4a, 0x92, 0x4a, 0xfe, 0x2c, 0x5a, 0x52, 0xb3,
+ 0xeb, 0x84, 0xb1, 0x19, 0x93, 0x73, 0x9a, 0xd3, 0x20, 0xc3, 0xfd, 0x7c, 0x84, 0xcd, 0xab, 0x4a,
+ 0x6a, 0xf6, 0x70, 0x3f, 0x24, 0x4c, 0x64, 0xb8, 0x94, 0x1b, 0xfd, 0x16, 0xb2, 0xed, 0x1e, 0x6e,
+ 0xbf, 0x50, 0xec, 0x71, 0x25, 0x43, 0x25, 0x37, 0xa2, 0x24, 0xeb, 0x84, 0xaf, 0x35, 0x6e, 0xc6,
+ 0xe4, 0x4c, 0x9b, 0xfd, 0x44, 0x87, 0x50, 0xea, 0x6b, 0x96, 0xad, 0x58, 0x43, 0xd5, 0xb0, 0x7a,
+ 0xba, 0x6d, 0x55, 0xf2, 0x54, 0xc7, 0x5b, 0x51, 0x3a, 0x0e, 0x34, 0xcb, 0x3e, 0x71, 0x98, 0x9b,
+ 0x31, 0xb9, 0xd8, 0xf7, 0x13, 0x88, 0x3e, 0xfd, 0xe2, 0x02, 0x9b, 0xae, 0xc2, 0x4a, 0x61, 0xb6,
+ 0xbe, 0x23, 0xc2, 0xed, 0xc8, 0x13, 0x7d, 0xba, 0x9f, 0x80, 0x3e, 0x86, 0xd5, 0xbe, 0xae, 0x76,
+ 0x5c, 0x75, 0x4a, 0xbb, 0x37, 0x1a, 0xbe, 0xa8, 0x14, 0xa9, 0xd2, 0x5f, 0x44, 0x0e, 0x52, 0x57,
+ 0x3b, 0x8e, 0x8a, 0x3a, 0x11, 0x68, 0xc6, 0xe4, 0x95, 0x7e, 0x98, 0x88, 0x3e, 0x85, 0x35, 0xd5,
+ 0x30, 0xfa, 0x57, 0x61, 0xed, 0x25, 0xaa, 0xfd, 0x41, 0x94, 0xf6, 0x1a, 0x91, 0x09, 0xab, 0x47,
+ 0xea, 0x04, 0x15, 0x3d, 0x87, 0x95, 0x0b, 0x6d, 0xa8, 0xf6, 0xb5, 0x2f, 0xb0, 0xb7, 0x1e, 0x6b,
+ 0x54, 0xf9, 0xfd, 0x48, 0x63, 0xe4, 0x02, 0xbe, 0x25, 0x11, 0x2f, 0x42, 0x34, 0xd4, 0x02, 0xd1,
+ 0x30, 0xb1, 0xa1, 0x9a, 0x58, 0x31, 0x4c, 0xdd, 0xd0, 0x2d, 0xb5, 0x5f, 0x29, 0x53, 0xbd, 0xf7,
+ 0xa2, 0xf4, 0x1e, 0x33, 0xfe, 0x63, 0xce, 0xde, 0x8c, 0xc9, 0x65, 0x23, 0x48, 0x62, 0x5a, 0xf5,
+ 0x36, 0xb6, 0x2c, 0x4f, 0xab, 0x38, 0x4f, 0x2b, 0xe5, 0x0f, 0x6a, 0x0d, 0x90, 0x50, 0x03, 0xf2,
+ 0x78, 0x4c, 0xc4, 0x95, 0x4b, 0xdd, 0xc6, 0x95, 0x15, 0xaa, 0x50, 0x8a, 0x3c, 0xc0, 0x94, 0xf5,
+ 0x4c, 0xb7, 0x71, 0x33, 0x26, 0x03, 0x76, 0x5b, 0x48, 0x85, 0x6b, 0x97, 0xd8, 0xd4, 0x2e, 0xae,
+ 0xa8, 0x1a, 0x85, 0xf6, 0x10, 0x47, 0x53, 0x41, 0x54, 0xe1, 0x2f, 0xa3, 0x14, 0x9e, 0x51, 0x21,
+ 0xa2, 0xa2, 0xe1, 0x88, 0x34, 0x63, 0xf2, 0xea, 0xe5, 0x24, 0x99, 0xd8, 0xae, 0xbb, 0x5d, 0xd4,
+ 0x73, 0x56, 0x56, 0x67, 0xdb, 0xae, 0xb3, 0x57, 0x3b, 0x84, 0x99, 0xd8, 0xee, 0x85, 0x9f, 0xb0,
+ 0x93, 0x81, 0xd4, 0xa5, 0xda, 0x1f, 0xe1, 0xfd, 0x64, 0x36, 0x2d, 0x66, 0xf6, 0x93, 0xd9, 0xac,
+ 0x98, 0xdb, 0x4f, 0x66, 0x73, 0x22, 0xec, 0x27, 0xb3, 0x20, 0xe6, 0xa5, 0x7b, 0x90, 0xf7, 0xf9,
+ 0x2d, 0x54, 0x81, 0xcc, 0x00, 0x5b, 0x96, 0xda, 0xc5, 0xd4, 0xcd, 0xe5, 0x64, 0xa7, 0x29, 0x95,
+ 0xa0, 0xe0, 0xf7, 0x55, 0xd2, 0x57, 0x82, 0x2b, 0x49, 0xdc, 0x10, 0x91, 0xe4, 0x7e, 0xd7, 0x91,
+ 0xe4, 0x4d, 0x74, 0x17, 0x8a, 0x74, 0x2a, 0x8a, 0xd3, 0x4f, 0x7c, 0x61, 0x52, 0x2e, 0x50, 0xe2,
+ 0x19, 0x67, 0xda, 0x80, 0xbc, 0xf1, 0xd0, 0x70, 0x59, 0x12, 0x94, 0x05, 0x8c, 0x87, 0x86, 0xc3,
+ 0xf0, 0x33, 0x28, 0x90, 0x79, 0xbb, 0x1c, 0x49, 0xfa, 0x91, 0x3c, 0xa1, 0x71, 0x16, 0xe9, 0xaf,
+ 0x12, 0x20, 0x86, 0xfd, 0x1b, 0x7a, 0x1f, 0x92, 0xc4, 0xd5, 0x73, 0xaf, 0x5d, 0xdd, 0x62, 0x71,
+ 0x60, 0xcb, 0x89, 0x03, 0x5b, 0x2d, 0x27, 0x0e, 0xec, 0x64, 0xbf, 0x79, 0xb5, 0x11, 0xfb, 0xea,
+ 0xbf, 0x36, 0x04, 0x99, 0x4a, 0xa0, 0x9b, 0xc4, 0xab, 0xa9, 0xda, 0x50, 0xd1, 0x3a, 0x74, 0xc8,
+ 0x39, 0xe2, 0xb2, 0x54, 0x6d, 0xb8, 0xd7, 0x41, 0x07, 0x20, 0xb6, 0xf5, 0xa1, 0x85, 0x87, 0xd6,
+ 0xc8, 0x52, 0x58, 0x1c, 0xe2, 0xbe, 0x3a, 0xe0, 0x71, 0x59, 0x00, 0xaa, 0x3b, 0x9c, 0xc7, 0x94,
+ 0x51, 0x2e, 0xb7, 0x83, 0x04, 0x74, 0x08, 0xc5, 0x4b, 0xb5, 0xaf, 0x75, 0x54, 0x5b, 0x37, 0x15,
+ 0x0b, 0xdb, 0xdc, 0x79, 0xdf, 0x9d, 0xd8, 0xf3, 0x33, 0x87, 0xeb, 0x04, 0xdb, 0xa7, 0x46, 0x47,
+ 0xb5, 0xf1, 0x4e, 0xf2, 0x9b, 0x57, 0x1b, 0x82, 0x5c, 0xb8, 0xf4, 0xf5, 0xa0, 0x9f, 0x43, 0x59,
+ 0x35, 0x0c, 0xc5, 0xb2, 0x55, 0x1b, 0x2b, 0xe7, 0x57, 0x36, 0xb6, 0xa8, 0x3f, 0x2f, 0xc8, 0x45,
+ 0xd5, 0x30, 0x4e, 0x08, 0x75, 0x87, 0x10, 0xd1, 0x5b, 0x50, 0x22, 0xae, 0x5f, 0x53, 0xfb, 0x4a,
+ 0x0f, 0x6b, 0xdd, 0x9e, 0x5d, 0x49, 0x6f, 0x0a, 0xf7, 0x13, 0x72, 0x91, 0x53, 0x9b, 0x94, 0x88,
+ 0xb6, 0x60, 0xd5, 0x61, 0x6b, 0xeb, 0x26, 0x76, 0x78, 0x89, 0xa3, 0x2f, 0xca, 0x2b, 0xbc, 0xab,
+ 0xae, 0x9b, 0x98, 0xf1, 0x4b, 0x1d, 0xd7, 0x52, 0x68, 0x98, 0x40, 0x08, 0x92, 0x1d, 0xd5, 0x56,
+ 0xe9, 0x0e, 0x14, 0x64, 0xfa, 0x9b, 0xd0, 0x0c, 0xd5, 0xee, 0xf1, 0x75, 0xa5, 0xbf, 0xd1, 0x75,
+ 0x48, 0x73, 0xd5, 0x09, 0x3a, 0x0c, 0xde, 0x42, 0x6b, 0x90, 0x32, 0x4c, 0xfd, 0x12, 0xd3, 0x65,
+ 0xc9, 0xca, 0xac, 0x21, 0xc9, 0x50, 0x0a, 0x86, 0x14, 0x54, 0x82, 0xb8, 0x3d, 0xe6, 0x5f, 0x89,
+ 0xdb, 0x63, 0xf4, 0x2e, 0x24, 0xc9, 0x06, 0xd0, 0x6f, 0x94, 0xa6, 0x04, 0x51, 0x2e, 0xd7, 0xba,
+ 0x32, 0xb0, 0x4c, 0x39, 0xa5, 0xeb, 0xb0, 0x36, 0x2d, 0xc4, 0x48, 0x3d, 0x97, 0x1e, 0x08, 0x15,
+ 0xe8, 0x3d, 0xc8, 0xba, 0x3e, 0x95, 0xd9, 0xd7, 0xcd, 0x89, 0xaf, 0x38, 0xcc, 0xb2, 0xcb, 0x4a,
+ 0x0c, 0x8b, 0xec, 0x4f, 0x4f, 0xe5, 0x79, 0x41, 0x41, 0xce, 0xa8, 0x86, 0xd1, 0x54, 0xad, 0x9e,
+ 0xd4, 0x85, 0x4a, 0x54, 0xfc, 0xf0, 0xad, 0x8f, 0x40, 0x4f, 0x87, 0xb3, 0x3e, 0xbe, 0x93, 0x17,
+ 0xa7, 0x7b, 0xe2, 0x9e, 0x3c, 0x6a, 0xc1, 0xa3, 0xe1, 0x0b, 0x62, 0xc1, 0x09, 0xf6, 0x21, 0xda,
+ 0xde, 0xeb, 0x48, 0x1d, 0xb8, 0x19, 0x19, 0x4a, 0x02, 0x72, 0x42, 0x40, 0x8e, 0x6c, 0x06, 0x0b,
+ 0x50, 0x6c, 0xe0, 0xac, 0x41, 0x86, 0x66, 0xd1, 0x79, 0xd3, 0xcf, 0xe4, 0x64, 0xde, 0x92, 0x7e,
+ 0x0f, 0x37, 0x22, 0x62, 0x0a, 0xfa, 0x1d, 0xe4, 0xfb, 0x64, 0xf8, 0xdc, 0xcd, 0x4d, 0x49, 0xaa,
+ 0xd8, 0xe9, 0x39, 0x20, 0x4c, 0xd4, 0x99, 0xc9, 0xd0, 0x77, 0x7f, 0x4b, 0x3f, 0x24, 0xe1, 0xfa,
+ 0xf4, 0xb0, 0x82, 0x36, 0xa1, 0x30, 0x50, 0xc7, 0x8a, 0x3d, 0xe6, 0xb6, 0x2f, 0x50, 0x6b, 0x82,
+ 0x81, 0x3a, 0x6e, 0x8d, 0x99, 0xe1, 0x8b, 0x90, 0xb0, 0xc7, 0x56, 0x25, 0xbe, 0x99, 0xb8, 0x5f,
+ 0x90, 0xc9, 0x4f, 0xf4, 0x0c, 0x56, 0xfa, 0x7a, 0x5b, 0xed, 0x2b, 0x7d, 0xd5, 0xb2, 0x95, 0xb6,
+ 0x3e, 0x18, 0x68, 0x36, 0x3f, 0xd1, 0xb7, 0x26, 0x0d, 0x87, 0x76, 0x13, 0xaf, 0x47, 0x8f, 0x5f,
+ 0x4c, 0x2e, 0x53, 0xd9, 0x03, 0xd5, 0xb2, 0x59, 0x17, 0xda, 0x85, 0xfc, 0x40, 0xb3, 0xce, 0x71,
+ 0x4f, 0xbd, 0xd4, 0x74, 0xb3, 0x92, 0xdc, 0x4c, 0x4c, 0x4d, 0xe3, 0x9e, 0x79, 0x3c, 0x5c, 0x93,
+ 0x5f, 0xcc, 0xb7, 0xe1, 0xa9, 0xc0, 0x81, 0x70, 0x5c, 0x5a, 0x7a, 0x69, 0x97, 0xf6, 0x2e, 0xac,
+ 0x0d, 0xf1, 0xd8, 0x56, 0x5c, 0x77, 0x61, 0x31, 0x2b, 0xcc, 0xd0, 0xcd, 0x44, 0xa4, 0xcf, 0xf5,
+ 0x31, 0x16, 0x31, 0x48, 0xb2, 0xdf, 0xa6, 0x3e, 0x1a, 0x76, 0x2a, 0xd9, 0x4d, 0xe1, 0x7e, 0x4a,
+ 0x66, 0x0d, 0xf4, 0x18, 0x2a, 0xd4, 0x15, 0x30, 0xff, 0x48, 0x36, 0x04, 0x77, 0x1c, 0xbf, 0x90,
+ 0xa3, 0x36, 0x78, 0x8d, 0xf4, 0x53, 0x0f, 0x7c, 0x40, 0x7b, 0xb9, 0x2f, 0xd9, 0x86, 0x35, 0x16,
+ 0xd7, 0xb1, 0x49, 0x02, 0x3c, 0xd9, 0x24, 0x3a, 0x00, 0xa0, 0x03, 0x58, 0x71, 0xfa, 0x8e, 0x4d,
+ 0xbd, 0x35, 0xa6, 0xdf, 0x7f, 0xd7, 0x15, 0xe8, 0x28, 0xe4, 0xd0, 0x38, 0x96, 0x9e, 0xa7, 0x47,
+ 0x00, 0x39, 0x7d, 0x35, 0xc3, 0x0d, 0x14, 0x8f, 0xbd, 0xe3, 0x50, 0x98, 0xcc, 0x62, 0x79, 0x97,
+ 0xe7, 0x94, 0xbd, 0xd3, 0xb2, 0x01, 0xf9, 0xcf, 0x47, 0xba, 0x39, 0x1a, 0xb0, 0x21, 0x15, 0xe9,
+ 0x90, 0x80, 0x91, 0xe8, 0xe1, 0xfc, 0xe7, 0x94, 0xcf, 0xe6, 0x82, 0x19, 0x06, 0xb7, 0x28, 0xc1,
+ 0xb3, 0xa8, 0x13, 0xdf, 0xc0, 0xfd, 0x46, 0x15, 0x5f, 0xd4, 0xa8, 0xdc, 0xb9, 0x45, 0xdb, 0x55,
+ 0xe2, 0xc7, 0xd9, 0x15, 0x82, 0x24, 0x9d, 0x61, 0x92, 0x39, 0x64, 0xf2, 0x3b, 0xd2, 0xd6, 0xdc,
+ 0xfd, 0x4f, 0xfb, 0xf7, 0xdf, 0xb1, 0xc0, 0xcc, 0x4f, 0x66, 0x81, 0xd9, 0x48, 0x0b, 0xfc, 0xd1,
+ 0xb6, 0xd6, 0x82, 0xeb, 0x21, 0x41, 0x65, 0x44, 0x83, 0x26, 0xb5, 0xb6, 0xd0, 0x1d, 0xc5, 0x09,
+ 0xd5, 0x3e, 0x45, 0xf2, 0x6a, 0x40, 0x2f, 0x0b, 0xb8, 0x91, 0x16, 0x9c, 0x5f, 0xd6, 0x82, 0x0b,
+ 0x8b, 0x58, 0x70, 0xf1, 0x4d, 0x2c, 0xb8, 0x34, 0x61, 0xc1, 0xa7, 0xb0, 0x32, 0x91, 0xe4, 0xba,
+ 0xe6, 0x20, 0x4c, 0x35, 0x87, 0xf8, 0x74, 0x73, 0x48, 0xf8, 0xcc, 0x41, 0xfa, 0x4e, 0x80, 0x6a,
+ 0x74, 0xae, 0x3b, 0xf5, 0x03, 0xbf, 0x82, 0x6b, 0x5e, 0xce, 0xe3, 0x5f, 0x47, 0x16, 0x57, 0x90,
+ 0xdb, 0xe9, 0x2d, 0xe4, 0x8c, 0xfc, 0x80, 0x8d, 0x29, 0xe9, 0x37, 0xd1, 0x67, 0x50, 0x0e, 0x66,
+ 0xe9, 0x24, 0x09, 0x22, 0xc7, 0xe5, 0x8f, 0x26, 0x8e, 0x8b, 0xb7, 0x16, 0xee, 0x98, 0xe5, 0xd2,
+ 0xa5, 0xbf, 0x69, 0x49, 0xff, 0x1e, 0x77, 0x73, 0x80, 0x40, 0xca, 0x8d, 0x3e, 0x80, 0x34, 0x3f,
+ 0xd9, 0xc2, 0xa2, 0x27, 0x9b, 0x0b, 0x84, 0x4f, 0x73, 0xfc, 0xcd, 0x4e, 0x73, 0x62, 0xea, 0xf6,
+ 0x25, 0xa7, 0x2f, 0x55, 0xca, 0xbf, 0x54, 0xef, 0x40, 0x8a, 0x05, 0x61, 0x16, 0x50, 0x6e, 0x4c,
+ 0x9e, 0x0b, 0x16, 0x7f, 0x19, 0x17, 0xaa, 0x41, 0x96, 0xe5, 0xf3, 0x5a, 0x87, 0x3b, 0x80, 0x9b,
+ 0x11, 0x12, 0x7b, 0xbb, 0x3b, 0xf9, 0xd7, 0xaf, 0x36, 0x32, 0xbc, 0x21, 0x67, 0xa8, 0xdc, 0x5e,
+ 0x47, 0xfa, 0x5b, 0x80, 0xac, 0x8c, 0x2d, 0x83, 0x98, 0x30, 0xda, 0x81, 0x1c, 0x1e, 0xb7, 0xb1,
+ 0x61, 0x3b, 0x77, 0x87, 0xe9, 0x77, 0x33, 0xc6, 0xdd, 0x70, 0x38, 0x9b, 0x31, 0xd9, 0x13, 0x43,
+ 0x8f, 0x38, 0x36, 0x13, 0x0d, 0xb3, 0x70, 0x71, 0x3f, 0x38, 0xf3, 0x6b, 0x07, 0x9c, 0x61, 0x81,
+ 0x7e, 0x3d, 0x52, 0x2a, 0x84, 0xce, 0x3c, 0xe2, 0xe8, 0x4c, 0x72, 0xce, 0xc7, 0x02, 0xf0, 0x4c,
+ 0x3d, 0x00, 0xcf, 0xa4, 0xe6, 0x4c, 0x33, 0x02, 0x9f, 0xf9, 0xb5, 0x83, 0xcf, 0xa4, 0xe7, 0x8c,
+ 0x38, 0x04, 0xd0, 0xfc, 0x6e, 0x02, 0xa0, 0xd9, 0x8c, 0x14, 0x9d, 0x82, 0xd0, 0x1c, 0x4d, 0x20,
+ 0x34, 0x59, 0xaa, 0xe4, 0xe7, 0x91, 0x4a, 0xe6, 0x40, 0x34, 0x47, 0x13, 0x10, 0x4d, 0x6e, 0x8e,
+ 0xc2, 0x39, 0x18, 0xcd, 0x5f, 0x4c, 0xc7, 0x68, 0x20, 0x12, 0x45, 0xe1, 0xc3, 0x5c, 0x0c, 0xa4,
+ 0x51, 0x22, 0x40, 0x9a, 0x7c, 0xe4, 0xbd, 0x9f, 0xa9, 0x5f, 0x18, 0xa5, 0xf9, 0xfd, 0x34, 0x94,
+ 0x66, 0x25, 0x12, 0x60, 0xe2, 0x56, 0xb9, 0x08, 0x4c, 0x73, 0x3a, 0x05, 0xa6, 0x29, 0x44, 0xc2,
+ 0x3f, 0x4c, 0xf1, 0x02, 0x38, 0xcd, 0xe9, 0x14, 0x9c, 0xa6, 0x38, 0x57, 0xed, 0x5c, 0xa0, 0xe6,
+ 0x49, 0x10, 0xa8, 0x29, 0x45, 0xdc, 0x83, 0x3d, 0x67, 0x10, 0x81, 0xd4, 0x9c, 0x47, 0x21, 0x35,
+ 0x0c, 0xa1, 0x7a, 0x3b, 0x52, 0xe3, 0x12, 0x50, 0xcd, 0xd1, 0x04, 0x54, 0x23, 0xce, 0xb1, 0xe1,
+ 0x05, 0xb1, 0x1a, 0xe9, 0x17, 0x24, 0x4a, 0x87, 0xdc, 0x1d, 0x71, 0xdd, 0xd8, 0x34, 0x75, 0x93,
+ 0xa3, 0x2b, 0xac, 0x21, 0xdd, 0x27, 0x77, 0x6d, 0xcf, 0xb5, 0xcd, 0xc0, 0x6f, 0xca, 0x50, 0x0c,
+ 0xb8, 0x33, 0xe9, 0x1f, 0x05, 0x4f, 0x96, 0x22, 0x38, 0xfe, 0x7b, 0x7a, 0x8e, 0xdf, 0xd3, 0x43,
+ 0x77, 0xcb, 0x5c, 0x20, 0xd7, 0xf0, 0x67, 0x33, 0x1c, 0xb0, 0x51, 0xbd, 0x2c, 0xe6, 0x01, 0xac,
+ 0xd0, 0xbc, 0x97, 0xc5, 0x8a, 0x40, 0x38, 0x2a, 0x93, 0x0e, 0xb6, 0x0a, 0x2c, 0x2e, 0xbd, 0x03,
+ 0xab, 0x3e, 0x5e, 0xf7, 0x72, 0xcc, 0x50, 0x0b, 0xd1, 0xe5, 0xae, 0xf1, 0x5b, 0xf2, 0xbf, 0x26,
+ 0xbc, 0x15, 0xf2, 0x90, 0x9e, 0x69, 0xa0, 0x8c, 0xf0, 0xa3, 0x41, 0x99, 0xe8, 0x4b, 0x3a, 0xfa,
+ 0x18, 0xd6, 0x02, 0x78, 0x8d, 0x93, 0x56, 0x26, 0x96, 0x83, 0x6d, 0x62, 0xbe, 0x2c, 0xc7, 0xed,
+ 0x41, 0x9f, 0xc0, 0x2d, 0x9a, 0x20, 0x47, 0xa4, 0xae, 0xc9, 0xc5, 0x52, 0xd7, 0x1b, 0x44, 0x47,
+ 0x7d, 0x4a, 0xfa, 0x1a, 0x01, 0xe6, 0xa4, 0x22, 0xc0, 0x1c, 0x74, 0x00, 0x85, 0x2e, 0x1e, 0x62,
+ 0x4b, 0xb3, 0x94, 0x25, 0xee, 0x9c, 0x02, 0xc9, 0xf8, 0x9b, 0x31, 0x39, 0xcf, 0x65, 0x49, 0xef,
+ 0xdf, 0x08, 0xc2, 0x4e, 0x19, 0x8a, 0x8a, 0x5f, 0x9d, 0xf4, 0x3f, 0x82, 0x67, 0x96, 0x2e, 0x5a,
+ 0xd4, 0xd6, 0x3b, 0xcc, 0x7c, 0x8b, 0x32, 0xfd, 0x4d, 0x6e, 0x57, 0x7d, 0xbd, 0xcb, 0x2d, 0x90,
+ 0xfc, 0x24, 0x5c, 0x6e, 0x81, 0x24, 0xc7, 0x23, 0xec, 0x1a, 0xa4, 0xb4, 0x61, 0x07, 0x8f, 0xb9,
+ 0x91, 0xb1, 0x06, 0x91, 0x7d, 0x81, 0xaf, 0xb8, 0x29, 0x91, 0x9f, 0x84, 0x8f, 0x9e, 0x33, 0x3a,
+ 0x97, 0x82, 0xcc, 0x1a, 0xe8, 0x7d, 0xc8, 0xd1, 0x2a, 0x97, 0xa2, 0x1b, 0x16, 0x8f, 0x91, 0x81,
+ 0x54, 0x8e, 0x55, 0xa4, 0xb6, 0x8e, 0x09, 0xcf, 0x91, 0x61, 0xc9, 0x59, 0x83, 0xff, 0xf2, 0x25,
+ 0x5b, 0xd9, 0x40, 0xb2, 0x75, 0x1b, 0x72, 0x64, 0xf4, 0x96, 0xa1, 0xb6, 0x31, 0x8d, 0x6f, 0x39,
+ 0xd9, 0x23, 0x48, 0xff, 0x24, 0x40, 0x39, 0x14, 0x72, 0xa7, 0xce, 0xdd, 0x39, 0x95, 0xf1, 0x20,
+ 0x7a, 0x36, 0x31, 0xfb, 0x3b, 0x00, 0x5d, 0xd5, 0x52, 0x5e, 0xaa, 0x43, 0x1b, 0x77, 0xf8, 0x12,
+ 0xe4, 0xba, 0xaa, 0xf5, 0x9c, 0x12, 0x82, 0x83, 0x49, 0x85, 0x06, 0xe3, 0xc3, 0x6f, 0xd2, 0x7e,
+ 0xfc, 0x06, 0x55, 0x21, 0x6b, 0x98, 0x9a, 0x6e, 0x6a, 0xf6, 0x15, 0x5d, 0x93, 0x84, 0xec, 0xb6,
+ 0xa5, 0x63, 0xb8, 0x36, 0x35, 0xda, 0xa3, 0xc7, 0x90, 0xf3, 0x12, 0x05, 0x81, 0x26, 0xb5, 0x33,
+ 0x60, 0x31, 0x8f, 0x97, 0x2c, 0xc9, 0xb5, 0xa9, 0xf1, 0x1e, 0x35, 0x20, 0x6d, 0x62, 0x6b, 0xd4,
+ 0x67, 0x49, 0x76, 0xe9, 0xe1, 0x3b, 0x8b, 0xe5, 0x09, 0x84, 0x3a, 0xea, 0xdb, 0x32, 0x17, 0x96,
+ 0x3e, 0x85, 0x34, 0xa3, 0xa0, 0x3c, 0x64, 0x4e, 0x0f, 0x9f, 0x1e, 0x1e, 0x3d, 0x3f, 0x14, 0x63,
+ 0x08, 0x20, 0x5d, 0xab, 0xd7, 0x1b, 0xc7, 0x2d, 0x51, 0x40, 0x39, 0x48, 0xd5, 0x76, 0x8e, 0xe4,
+ 0x96, 0x18, 0x27, 0x64, 0xb9, 0xb1, 0xdf, 0xa8, 0xb7, 0xc4, 0x04, 0x5a, 0x81, 0x22, 0xfb, 0xad,
+ 0x3c, 0x39, 0x92, 0x9f, 0xd5, 0x5a, 0x62, 0xd2, 0x47, 0x3a, 0x69, 0x1c, 0xee, 0x36, 0x64, 0x31,
+ 0x25, 0xfd, 0x0a, 0x6e, 0x46, 0x66, 0x16, 0x1e, 0x72, 0x26, 0xf8, 0x90, 0x33, 0xe9, 0xdb, 0x38,
+ 0xb9, 0x3a, 0x45, 0xa5, 0x0b, 0x68, 0x3f, 0x34, 0xf1, 0x87, 0x4b, 0xe4, 0x1a, 0xa1, 0xd9, 0xa3,
+ 0xb7, 0xa0, 0x64, 0xe2, 0x0b, 0x6c, 0xb7, 0x7b, 0x2c, 0x7d, 0x71, 0x00, 0xb0, 0x22, 0xa7, 0x52,
+ 0x21, 0x8b, 0xb1, 0x7d, 0x86, 0xdb, 0xb6, 0xc2, 0x8c, 0xc0, 0xa2, 0x30, 0x43, 0x8e, 0xb0, 0x11,
+ 0xea, 0x09, 0x23, 0x12, 0xff, 0xcf, 0xfc, 0x14, 0x53, 0x95, 0xa4, 0xaa, 0x80, 0xba, 0x1d, 0x4a,
+ 0x91, 0x5e, 0x2e, 0xb5, 0xd8, 0x39, 0x48, 0xc9, 0x8d, 0x96, 0xfc, 0x91, 0x98, 0x40, 0x08, 0x4a,
+ 0xf4, 0xa7, 0x72, 0x72, 0x58, 0x3b, 0x3e, 0x69, 0x1e, 0x91, 0xc5, 0x5e, 0x85, 0xb2, 0xb3, 0xd8,
+ 0x0e, 0x31, 0x85, 0xae, 0xc1, 0x4a, 0xfd, 0xe8, 0xd9, 0xf1, 0x41, 0xa3, 0xd5, 0xf0, 0xc8, 0x69,
+ 0xa9, 0x0a, 0x95, 0xa8, 0x14, 0x49, 0xfa, 0xcf, 0x04, 0xdc, 0x88, 0x48, 0x73, 0xd0, 0xfb, 0x00,
+ 0xf6, 0x58, 0x31, 0x71, 0x5b, 0x37, 0x3b, 0xd1, 0x86, 0xdb, 0x1a, 0xcb, 0x94, 0x43, 0xce, 0xd9,
+ 0xfc, 0xd7, 0xcc, 0x58, 0xf1, 0x5b, 0xae, 0x94, 0x2c, 0x84, 0xc5, 0x01, 0x9b, 0x3b, 0x53, 0x6e,
+ 0xa0, 0xb8, 0x4d, 0x14, 0xd3, 0xfd, 0xa2, 0x8a, 0x29, 0x3f, 0xfa, 0x08, 0x6e, 0x84, 0x42, 0x1a,
+ 0x8f, 0x03, 0xd6, 0xb4, 0x02, 0xef, 0xf4, 0xc8, 0x76, 0x2d, 0x18, 0xd9, 0x58, 0x1c, 0xb0, 0x66,
+ 0xa0, 0x23, 0xa9, 0x37, 0x40, 0x47, 0xa2, 0x42, 0x63, 0x7a, 0xd9, 0x8a, 0xc6, 0xb4, 0xd0, 0x18,
+ 0x4a, 0x39, 0x32, 0xe1, 0x94, 0x43, 0xfa, 0xdf, 0xc0, 0xee, 0x06, 0x53, 0xcb, 0x23, 0x48, 0x5b,
+ 0xb6, 0x6a, 0x8f, 0x2c, 0x7e, 0x92, 0x1e, 0x2f, 0x9a, 0xa7, 0x6e, 0x39, 0x3f, 0x4e, 0xa8, 0xb8,
+ 0xcc, 0xd5, 0xfc, 0x41, 0x6e, 0x7a, 0xd4, 0xf6, 0xa4, 0x7e, 0x8a, 0xed, 0x69, 0x42, 0x1a, 0x5f,
+ 0xe2, 0xa1, 0x6d, 0x55, 0xd2, 0x74, 0xc6, 0xd7, 0x27, 0x67, 0x4c, 0xba, 0x77, 0x2a, 0x24, 0xf7,
+ 0xf9, 0xef, 0x57, 0x1b, 0x22, 0xe3, 0x7e, 0x5b, 0x1f, 0x68, 0x36, 0x1e, 0x18, 0xf6, 0x95, 0xcc,
+ 0xe5, 0xa5, 0xf7, 0xa0, 0x14, 0x5c, 0xf4, 0x68, 0x17, 0xe2, 0x39, 0xe9, 0xb8, 0xf4, 0x0f, 0x02,
+ 0xac, 0x4e, 0xc1, 0x72, 0xd0, 0x63, 0x5e, 0x08, 0x62, 0x1b, 0x7f, 0x77, 0x72, 0xf5, 0x02, 0xec,
+ 0x5e, 0x3d, 0x88, 0x04, 0x4d, 0xef, 0xea, 0xc0, 0xf6, 0xd8, 0x23, 0xa0, 0x5f, 0x42, 0xd9, 0xd2,
+ 0xba, 0x43, 0xc5, 0x64, 0xb0, 0x90, 0x5b, 0x64, 0x21, 0x99, 0x3d, 0xe9, 0x70, 0x4a, 0x91, 0x1d,
+ 0x92, 0xf9, 0x20, 0x10, 0x95, 0x10, 0xb7, 0xd4, 0x06, 0x34, 0x79, 0x93, 0x99, 0x06, 0x5c, 0x09,
+ 0x6f, 0x00, 0x5c, 0xfd, 0xbd, 0x00, 0xb7, 0x66, 0xdc, 0x6e, 0xd0, 0x87, 0xa1, 0x73, 0xf1, 0xc1,
+ 0x32, 0x77, 0xa3, 0x2d, 0x46, 0x0b, 0x9e, 0x0c, 0xe9, 0x11, 0x14, 0xfc, 0xf4, 0xc5, 0x36, 0x6f,
+ 0xdf, 0x8b, 0xfd, 0x41, 0x80, 0xed, 0x2e, 0x14, 0x4d, 0x6c, 0x13, 0x27, 0x15, 0x40, 0x24, 0x0b,
+ 0x8c, 0xc8, 0xd2, 0xd4, 0xfd, 0x64, 0x56, 0x10, 0xe3, 0xae, 0xfd, 0xfc, 0x9b, 0x00, 0xe0, 0xa1,
+ 0x6e, 0x1e, 0xea, 0x25, 0xf8, 0x51, 0xaf, 0x10, 0x58, 0x1a, 0x0f, 0x83, 0xa5, 0xe8, 0x1e, 0x94,
+ 0xd9, 0x7d, 0x84, 0xec, 0x9b, 0x6a, 0x8f, 0x4c, 0xcc, 0x31, 0xb6, 0x12, 0x25, 0x9f, 0x38, 0x54,
+ 0xf4, 0x31, 0xdc, 0xb4, 0x7b, 0x26, 0xb6, 0x7a, 0x7a, 0xbf, 0xa3, 0x84, 0xf7, 0x8e, 0xd5, 0x7e,
+ 0x36, 0xe6, 0x18, 0x9d, 0x7c, 0xc3, 0xd5, 0x70, 0x16, 0xdc, 0xbf, 0x2f, 0x20, 0x45, 0x8f, 0x0d,
+ 0x49, 0xfa, 0x5c, 0x2b, 0xce, 0x71, 0x03, 0xfd, 0x04, 0x40, 0xb5, 0x6d, 0x53, 0x3b, 0x1f, 0x11,
+ 0xef, 0x10, 0x9f, 0xfc, 0x94, 0x77, 0xec, 0x6a, 0x0e, 0xdf, 0xce, 0x6d, 0x7e, 0xfe, 0xd6, 0x3c,
+ 0x51, 0xdf, 0x19, 0xf4, 0x29, 0x94, 0x0e, 0xa1, 0x14, 0x94, 0x75, 0xb2, 0x69, 0x36, 0x86, 0x60,
+ 0x36, 0xcd, 0xb2, 0x73, 0x9e, 0x4d, 0xbb, 0xb9, 0x78, 0x82, 0xd5, 0x6c, 0x69, 0x43, 0xfa, 0x41,
+ 0x80, 0x82, 0xdf, 0xeb, 0x2d, 0x9c, 0xf0, 0xf2, 0x0b, 0x40, 0x62, 0xf2, 0x02, 0x90, 0xf4, 0xa5,
+ 0xc0, 0x37, 0x21, 0x4b, 0x52, 0xe0, 0x91, 0x85, 0x3b, 0xbc, 0x92, 0x9d, 0xe9, 0xaa, 0xd6, 0xa9,
+ 0x85, 0x3b, 0x3e, 0xdf, 0x94, 0x79, 0x33, 0xdf, 0x14, 0x4c, 0xa4, 0xb3, 0xa1, 0x44, 0x7a, 0x3f,
+ 0x99, 0x4d, 0x89, 0x69, 0xd9, 0x97, 0x89, 0x4b, 0x7f, 0x2d, 0x40, 0xd6, 0x9d, 0x6f, 0xb0, 0x84,
+ 0x1b, 0xc0, 0x65, 0xd9, 0x72, 0xb1, 0x02, 0x2e, 0xbf, 0xba, 0xb0, 0x82, 0x76, 0xc2, 0x2d, 0x68,
+ 0xff, 0xc6, 0x4d, 0x06, 0xa3, 0x90, 0x47, 0xff, 0xe2, 0x3a, 0x60, 0x33, 0xcf, 0x7d, 0xff, 0x8e,
+ 0x8f, 0x83, 0x64, 0x2c, 0xe8, 0x4f, 0x20, 0xad, 0xb6, 0x5d, 0xbc, 0xb5, 0x34, 0x05, 0x88, 0x74,
+ 0x58, 0xb7, 0x5a, 0xe3, 0x1a, 0xe5, 0x94, 0xb9, 0x04, 0x1f, 0x55, 0xdc, 0x19, 0x95, 0x74, 0x40,
+ 0xf4, 0x32, 0x9e, 0xe0, 0x49, 0x2f, 0x01, 0x9c, 0x1e, 0x3e, 0x3b, 0xda, 0xdd, 0x7b, 0xb2, 0xd7,
+ 0xd8, 0xe5, 0xd9, 0xde, 0xee, 0x6e, 0x63, 0x57, 0x8c, 0x13, 0x3e, 0xb9, 0xf1, 0xec, 0xe8, 0xac,
+ 0xb1, 0x2b, 0x26, 0x48, 0x63, 0xb7, 0x71, 0x50, 0xfb, 0xa8, 0xb1, 0x2b, 0x26, 0xa5, 0x1a, 0xe4,
+ 0xdc, 0xa0, 0x43, 0x2b, 0xff, 0xfa, 0x4b, 0x6c, 0xf2, 0xd5, 0x62, 0x0d, 0xb4, 0x0e, 0xf9, 0xc9,
+ 0x82, 0x01, 0xb9, 0xbc, 0xb1, 0x3a, 0x01, 0x09, 0x03, 0x65, 0x57, 0x07, 0x8f, 0x4d, 0xbf, 0x81,
+ 0x8c, 0x31, 0x3a, 0x57, 0x1c, 0xdb, 0x0d, 0xc1, 0xec, 0xce, 0xdd, 0x6e, 0x74, 0xde, 0xd7, 0xda,
+ 0x4f, 0xf1, 0x15, 0x0f, 0x72, 0x69, 0x63, 0x74, 0xfe, 0x94, 0x99, 0x38, 0x1b, 0x46, 0x7c, 0xc6,
+ 0x30, 0x12, 0xa1, 0x61, 0xa0, 0x7b, 0x50, 0x18, 0xea, 0x1d, 0xac, 0xa8, 0x9d, 0x8e, 0x89, 0x2d,
+ 0x16, 0xbb, 0x73, 0x5c, 0x73, 0x9e, 0xf4, 0xd4, 0x58, 0x87, 0xf4, 0x9d, 0x00, 0x68, 0x32, 0xd0,
+ 0xa2, 0x13, 0x58, 0xf1, 0x62, 0xb5, 0x93, 0x00, 0xb0, 0x48, 0xb0, 0x19, 0x1d, 0xa8, 0x03, 0xf8,
+ 0x82, 0x78, 0x19, 0x24, 0x93, 0xac, 0x6f, 0xcd, 0x73, 0x55, 0x06, 0x9d, 0x2f, 0x5d, 0x94, 0xf8,
+ 0x82, 0x8b, 0x12, 0x93, 0x91, 0x2b, 0xef, 0xf6, 0x84, 0x5d, 0x69, 0x62, 0xa2, 0xee, 0x64, 0x40,
+ 0xa5, 0x35, 0x21, 0xc6, 0xe7, 0x19, 0x35, 0x24, 0xe1, 0x4d, 0x86, 0x24, 0x3d, 0x02, 0xf1, 0x43,
+ 0xf7, 0xfb, 0x5e, 0xfe, 0xe8, 0x1f, 0xa6, 0x30, 0x31, 0xcc, 0x4b, 0xc8, 0x12, 0xef, 0x4b, 0x83,
+ 0xc6, 0x9f, 0x42, 0xce, 0x5d, 0x3d, 0xf7, 0xf1, 0x50, 0xe4, 0xb2, 0xf3, 0x91, 0x78, 0x22, 0xe8,
+ 0x01, 0xac, 0x90, 0xb8, 0xe1, 0x54, 0x7f, 0x19, 0x42, 0x18, 0xa7, 0xde, 0xb0, 0xcc, 0x3a, 0x0e,
+ 0x1c, 0x58, 0x8b, 0xc4, 0x68, 0x91, 0xc5, 0x72, 0xdc, 0xf9, 0xff, 0x18, 0x00, 0xb9, 0xf3, 0x85,
+ 0x80, 0x52, 0xb6, 0x87, 0xc5, 0x40, 0x32, 0x21, 0xfd, 0x65, 0x1c, 0xf2, 0xbe, 0x6a, 0x14, 0xfa,
+ 0xe3, 0x40, 0x62, 0xb5, 0x39, 0xab, 0x72, 0xe5, 0xcb, 0xaa, 0x02, 0x13, 0x8b, 0x2f, 0x3f, 0xb1,
+ 0xa8, 0x3a, 0xa0, 0x53, 0x94, 0x4e, 0x2e, 0x5d, 0x94, 0x7e, 0x1b, 0x90, 0xad, 0xdb, 0x6a, 0x9f,
+ 0x04, 0x6f, 0x6d, 0xd8, 0x55, 0xd8, 0x69, 0x67, 0x85, 0x70, 0x91, 0xf6, 0x9c, 0xd1, 0x8e, 0x63,
+ 0x42, 0x97, 0xfa, 0x90, 0x75, 0x81, 0x89, 0xe5, 0xdf, 0xe4, 0x4c, 0x2b, 0xbe, 0x57, 0x21, 0x3b,
+ 0xc0, 0xb6, 0x4a, 0xc3, 0x1e, 0x03, 0xaa, 0xdc, 0xf6, 0x83, 0x0f, 0x20, 0xef, 0x7b, 0xa8, 0x44,
+ 0x22, 0xe1, 0x61, 0xe3, 0xb9, 0x18, 0xab, 0x66, 0xbe, 0xfc, 0x7a, 0x33, 0x71, 0x88, 0x5f, 0x92,
+ 0x4f, 0xc9, 0x8d, 0x7a, 0xb3, 0x51, 0x7f, 0x2a, 0x0a, 0xd5, 0xfc, 0x97, 0x5f, 0x6f, 0x66, 0x64,
+ 0x4c, 0x0b, 0x37, 0x0f, 0x9e, 0x42, 0x39, 0xb4, 0x03, 0x41, 0x07, 0x8d, 0xa0, 0xb4, 0x7b, 0x7a,
+ 0x7c, 0xb0, 0x57, 0xaf, 0xb5, 0x1a, 0xca, 0xd9, 0x51, 0xab, 0x21, 0x0a, 0xe8, 0x06, 0xac, 0x1e,
+ 0xec, 0xfd, 0x59, 0xb3, 0xa5, 0xd4, 0x0f, 0xf6, 0x1a, 0x87, 0x2d, 0xa5, 0xd6, 0x6a, 0xd5, 0xea,
+ 0x4f, 0xc5, 0xf8, 0xc3, 0x7f, 0xc9, 0x43, 0xb9, 0xb6, 0x53, 0xdf, 0xab, 0x19, 0x46, 0x5f, 0x6b,
+ 0xab, 0xd4, 0xdd, 0xd7, 0x21, 0x49, 0x51, 0xe7, 0x99, 0x6f, 0xa1, 0xab, 0xb3, 0xab, 0x71, 0xe8,
+ 0x09, 0xa4, 0x28, 0x20, 0x8d, 0x66, 0x3f, 0x8e, 0xae, 0xce, 0x29, 0xcf, 0x91, 0xc1, 0xd0, 0x73,
+ 0x33, 0xf3, 0xb5, 0x74, 0x75, 0x76, 0xb5, 0x0e, 0x1d, 0x40, 0xc6, 0x01, 0xe3, 0xe6, 0x3d, 0x61,
+ 0xae, 0xce, 0x2d, 0xa1, 0x91, 0xa9, 0x31, 0x50, 0x73, 0xf6, 0x43, 0xea, 0xea, 0x9c, 0x3a, 0x1e,
+ 0x92, 0x21, 0xe7, 0xc1, 0xdc, 0xf3, 0xdf, 0x74, 0x57, 0x17, 0xa8, 0x2b, 0xa2, 0x4f, 0xa1, 0x18,
+ 0x84, 0xed, 0x16, 0x7b, 0x6e, 0x5d, 0x5d, 0xb0, 0xe6, 0x47, 0xf4, 0x07, 0x31, 0xbc, 0xc5, 0x9e,
+ 0x5f, 0x57, 0x17, 0x2c, 0x01, 0xa2, 0xcf, 0x60, 0x65, 0x12, 0x63, 0x5b, 0xfc, 0x35, 0x76, 0x75,
+ 0x89, 0xa2, 0x20, 0x1a, 0x00, 0x9a, 0x82, 0xcd, 0x2d, 0xf1, 0x38, 0xbb, 0xba, 0x4c, 0x8d, 0x10,
+ 0x75, 0x41, 0x9c, 0x78, 0x2e, 0xb7, 0xf0, 0x63, 0xed, 0xea, 0xe2, 0x05, 0x43, 0xd4, 0x81, 0x72,
+ 0x18, 0x04, 0x5b, 0xf4, 0xf1, 0x76, 0x75, 0xe1, 0xf2, 0x21, 0xfb, 0x4a, 0x10, 0x8c, 0x59, 0xf4,
+ 0x31, 0x77, 0x75, 0xe1, 0x6a, 0x22, 0x3a, 0x05, 0xf0, 0x5d, 0xa2, 0x17, 0x78, 0xdc, 0x5d, 0x5d,
+ 0xa4, 0xae, 0x88, 0x0c, 0x58, 0x9d, 0x76, 0x6b, 0x5e, 0xe6, 0xad, 0x77, 0x75, 0xa9, 0x72, 0x23,
+ 0x39, 0x38, 0xc1, 0x0b, 0xf0, 0x62, 0x6f, 0xbf, 0xab, 0x0b, 0xd6, 0x1d, 0x77, 0x76, 0xbe, 0x79,
+ 0xbd, 0x2e, 0x7c, 0xfb, 0x7a, 0x5d, 0xf8, 0xee, 0xf5, 0xba, 0xf0, 0xd5, 0xf7, 0xeb, 0xb1, 0x6f,
+ 0xbf, 0x5f, 0x8f, 0xfd, 0xc7, 0xf7, 0xeb, 0xb1, 0x3f, 0xbf, 0xdf, 0xd5, 0xec, 0xde, 0xe8, 0x7c,
+ 0xab, 0xad, 0x0f, 0xe8, 0x7f, 0x7a, 0x0c, 0xf5, 0x6a, 0x9b, 0xe9, 0x24, 0x2d, 0xdf, 0x3f, 0x87,
+ 0xce, 0xd3, 0x34, 0xa8, 0x3e, 0xfa, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0c, 0x9b, 0xee, 0x1d,
+ 0x59, 0x34, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -4748,6 +4749,7 @@ type ABCIApplicationClient interface {
OfferSnapshot(ctx context.Context, in *RequestOfferSnapshot, opts ...grpc.CallOption) (*ResponseOfferSnapshot, error)
LoadSnapshotChunk(ctx context.Context, in *RequestLoadSnapshotChunk, opts ...grpc.CallOption) (*ResponseLoadSnapshotChunk, error)
ApplySnapshotChunk(ctx context.Context, in *RequestApplySnapshotChunk, opts ...grpc.CallOption) (*ResponseApplySnapshotChunk, error)
+ FinalizeSnapshot(ctx context.Context, in *RequestFinalizeSnapshot, opts ...grpc.CallOption) (*ResponseFinalizeSnapshot, error)
PrepareProposal(ctx context.Context, in *RequestPrepareProposal, opts ...grpc.CallOption) (*ResponsePrepareProposal, error)
ProcessProposal(ctx context.Context, in *RequestProcessProposal, opts ...grpc.CallOption) (*ResponseProcessProposal, error)
ExtendVote(ctx context.Context, in *RequestExtendVote, opts ...grpc.CallOption) (*ResponseExtendVote, error)
@@ -4853,6 +4855,15 @@ func (c *aBCIApplicationClient) ApplySnapshotChunk(ctx context.Context, in *Requ
return out, nil
}
+func (c *aBCIApplicationClient) FinalizeSnapshot(ctx context.Context, in *RequestFinalizeSnapshot, opts ...grpc.CallOption) (*ResponseFinalizeSnapshot, error) {
+ out := new(ResponseFinalizeSnapshot)
+ err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/FinalizeSnapshot", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
func (c *aBCIApplicationClient) PrepareProposal(ctx context.Context, in *RequestPrepareProposal, opts ...grpc.CallOption) (*ResponsePrepareProposal, error) {
out := new(ResponsePrepareProposal)
err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/PrepareProposal", in, out, opts...)
@@ -4911,6 +4922,7 @@ type ABCIApplicationServer interface {
OfferSnapshot(context.Context, *RequestOfferSnapshot) (*ResponseOfferSnapshot, error)
LoadSnapshotChunk(context.Context, *RequestLoadSnapshotChunk) (*ResponseLoadSnapshotChunk, error)
ApplySnapshotChunk(context.Context, *RequestApplySnapshotChunk) (*ResponseApplySnapshotChunk, error)
+ FinalizeSnapshot(context.Context, *RequestFinalizeSnapshot) (*ResponseFinalizeSnapshot, error)
PrepareProposal(context.Context, *RequestPrepareProposal) (*ResponsePrepareProposal, error)
ProcessProposal(context.Context, *RequestProcessProposal) (*ResponseProcessProposal, error)
ExtendVote(context.Context, *RequestExtendVote) (*ResponseExtendVote, error)
@@ -4952,6 +4964,9 @@ func (*UnimplementedABCIApplicationServer) LoadSnapshotChunk(ctx context.Context
func (*UnimplementedABCIApplicationServer) ApplySnapshotChunk(ctx context.Context, req *RequestApplySnapshotChunk) (*ResponseApplySnapshotChunk, error) {
return nil, status.Errorf(codes.Unimplemented, "method ApplySnapshotChunk not implemented")
}
+func (*UnimplementedABCIApplicationServer) FinalizeSnapshot(ctx context.Context, req *RequestFinalizeSnapshot) (*ResponseFinalizeSnapshot, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method FinalizeSnapshot not implemented")
+}
func (*UnimplementedABCIApplicationServer) PrepareProposal(ctx context.Context, req *RequestPrepareProposal) (*ResponsePrepareProposal, error) {
return nil, status.Errorf(codes.Unimplemented, "method PrepareProposal not implemented")
}
@@ -5152,6 +5167,24 @@ func _ABCIApplication_ApplySnapshotChunk_Handler(srv interface{}, ctx context.Co
return interceptor(ctx, in, info, handler)
}
+func _ABCIApplication_FinalizeSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(RequestFinalizeSnapshot)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(ABCIApplicationServer).FinalizeSnapshot(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/tendermint.abci.ABCIApplication/FinalizeSnapshot",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(ABCIApplicationServer).FinalizeSnapshot(ctx, req.(*RequestFinalizeSnapshot))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
func _ABCIApplication_PrepareProposal_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(RequestPrepareProposal)
if err := dec(in); err != nil {
@@ -5286,6 +5319,10 @@ var _ABCIApplication_serviceDesc = grpc.ServiceDesc{
MethodName: "ApplySnapshotChunk",
Handler: _ABCIApplication_ApplySnapshotChunk_Handler,
},
+ {
+ MethodName: "FinalizeSnapshot",
+ Handler: _ABCIApplication_FinalizeSnapshot_Handler,
+ },
{
MethodName: "PrepareProposal",
Handler: _ABCIApplication_PrepareProposal_Handler,
diff --git a/internal/statesync/mocks/stateprovider.go b/internal/statesync/mocks/stateprovider.go
index 8ac2b1544c..a4189eb08e 100644
--- a/internal/statesync/mocks/stateprovider.go
+++ b/internal/statesync/mocks/stateprovider.go
@@ -145,6 +145,65 @@ func (_c *StateProvider_Commit_Call) RunAndReturn(run func(context.Context, uint
return _c
}
+// LightBlock provides a mock function with given fields: ctx, height
+func (_m *StateProvider) LightBlock(ctx context.Context, height uint64) (*types.LightBlock, error) {
+ ret := _m.Called(ctx, height)
+
+ if len(ret) == 0 {
+ panic("no return value specified for LightBlock")
+ }
+
+ var r0 *types.LightBlock
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, uint64) (*types.LightBlock, error)); ok {
+ return rf(ctx, height)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, uint64) *types.LightBlock); ok {
+ r0 = rf(ctx, height)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*types.LightBlock)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, uint64) error); ok {
+ r1 = rf(ctx, height)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// StateProvider_LightBlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LightBlock'
+type StateProvider_LightBlock_Call struct {
+ *mock.Call
+}
+
+// LightBlock is a helper method to define mock.On call
+// - ctx context.Context
+// - height uint64
+func (_e *StateProvider_Expecter) LightBlock(ctx interface{}, height interface{}) *StateProvider_LightBlock_Call {
+ return &StateProvider_LightBlock_Call{Call: _e.mock.On("LightBlock", ctx, height)}
+}
+
+func (_c *StateProvider_LightBlock_Call) Run(run func(ctx context.Context, height uint64)) *StateProvider_LightBlock_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(context.Context), args[1].(uint64))
+ })
+ return _c
+}
+
+func (_c *StateProvider_LightBlock_Call) Return(_a0 *types.LightBlock, _a1 error) *StateProvider_LightBlock_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *StateProvider_LightBlock_Call) RunAndReturn(run func(context.Context, uint64) (*types.LightBlock, error)) *StateProvider_LightBlock_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// State provides a mock function with given fields: ctx, height
func (_m *StateProvider) State(ctx context.Context, height uint64) (state.State, error) {
ret := _m.Called(ctx, height)
diff --git a/internal/statesync/stateprovider.go b/internal/statesync/stateprovider.go
index a76c6d546e..cd6104df52 100644
--- a/internal/statesync/stateprovider.go
+++ b/internal/statesync/stateprovider.go
@@ -40,6 +40,8 @@ type StateProvider interface {
Commit(ctx context.Context, height uint64) (*types.Commit, error)
// State returns a state object at the given height.
State(ctx context.Context, height uint64) (sm.State, error)
+ // LightBlock returns light block at the given height.
+ LightBlock(ctx context.Context, height uint64) (*types.LightBlock, error)
}
type stateProviderRPC struct {
@@ -124,6 +126,13 @@ func (s *stateProviderRPC) Commit(ctx context.Context, height uint64) (*types.Co
return header.Commit, nil
}
+// LightBlock implements StateProvider.
+func (s *stateProviderRPC) LightBlock(ctx context.Context, height uint64) (*types.LightBlock, error) {
+ s.Lock()
+ defer s.Unlock()
+ return s.verifyLightBlockAtHeight(ctx, height, time.Now())
+}
+
// State implements StateProvider.
func (s *stateProviderRPC) State(ctx context.Context, height uint64) (sm.State, error) {
s.Lock()
@@ -264,6 +273,13 @@ func (s *stateProviderP2P) Commit(ctx context.Context, height uint64) (*types.Co
return header.Commit, nil
}
+// LightBlock implements StateProvider.
+func (s *stateProviderP2P) LightBlock(ctx context.Context, height uint64) (*types.LightBlock, error) {
+ s.Lock()
+ defer s.Unlock()
+ return s.verifyLightBlockAtHeight(ctx, height, time.Now())
+}
+
// State implements StateProvider.
func (s *stateProviderP2P) State(ctx context.Context, height uint64) (sm.State, error) {
s.Lock()
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index 24ce2eb0a6..aff823cc2b 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -350,7 +350,8 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
"err", err, "height", snapshot.Height)
return sm.State{}, nil, errRejectSnapshot
}
- commit, err := s.getStateProvider().Commit(pctx, snapshot.Height)
+ block, err := s.getStateProvider().LightBlock(pctx, snapshot.Height)
+
if err != nil {
// check if the provider context exceeded the 10 second deadline
if ctx.Err() != nil {
@@ -358,9 +359,9 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
}
if err == light.ErrNoWitnesses {
return sm.State{}, nil,
- fmt.Errorf("failed to get commit at height %d. No witnesses remaining", snapshot.Height)
+ fmt.Errorf("failed to get light block at height %d. No witnesses remaining", snapshot.Height)
}
- s.logger.Info("failed to get and verify commit. Dropping snapshot and trying again",
+ s.logger.Info("failed to get and verify light block. Dropping snapshot and trying again",
"err", err, "height", snapshot.Height)
return sm.State{}, nil, errRejectSnapshot
}
@@ -371,6 +372,11 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
return sm.State{}, nil, err
}
+ // Finalize
+ if err := s.finalizeSnapshot(ctx, snapshot, block); err != nil {
+ return sm.State{}, nil, fmt.Errorf("failed to finalize snapshot: %w", err)
+ }
+
// Verify app and app version
if err := s.verifyApp(ctx, snapshot, state.Version.Consensus.App); err != nil {
return sm.State{}, nil, err
@@ -382,7 +388,7 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
"version", snapshot.Version,
"hash", snapshot.Hash)
- return state, commit, nil
+ return state, block.Commit, nil
}
// offerSnapshot offers a snapshot to the app. It returns various errors depending on the app's
@@ -572,6 +578,26 @@ func (s *syncer) requestChunk(ctx context.Context, snapshot *snapshot, chunkID t
return s.chunkCh.Send(ctx, msg)
}
+// / finalizeSnapshot sends light block to ABCI app after state sync is done
+func (s *syncer) finalizeSnapshot(ctx context.Context, snapshot *snapshot, block *types.LightBlock) error {
+ s.logger.Info("Finalizing snapshot restoration",
+ "snapshot", snapshot.Hash.String(),
+ "height", snapshot.Height,
+ "version", snapshot.Version,
+ "app_hash", snapshot.trustedAppHash,
+ )
+ lightBlock, err := block.ToProto()
+ if err != nil {
+ return fmt.Errorf("failed to convert light block %s to proto: %w", lightBlock.String(), err)
+ }
+
+ _, err = s.conn.FinalizeSnapshot(ctx, &abci.RequestFinalizeSnapshot{
+ LightBlock: lightBlock,
+ })
+
+ return err
+}
+
// verifyApp verifies the sync, checking the app hash, last block height and app version
func (s *syncer) verifyApp(ctx context.Context, snapshot *snapshot, appVersion uint64) error {
resp, err := s.conn.Info(ctx, &proxy.RequestInfo)
diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto
index 143fd5cc92..4a10c16abb 100644
--- a/proto/tendermint/abci/types.proto
+++ b/proto/tendermint/abci/types.proto
@@ -905,6 +905,7 @@ service ABCIApplication {
rpc OfferSnapshot(RequestOfferSnapshot) returns (ResponseOfferSnapshot);
rpc LoadSnapshotChunk(RequestLoadSnapshotChunk) returns (ResponseLoadSnapshotChunk);
rpc ApplySnapshotChunk(RequestApplySnapshotChunk) returns (ResponseApplySnapshotChunk);
+ rpc FinalizeSnapshot(RequestFinalizeSnapshot) returns (ResponseFinalizeSnapshot);
rpc PrepareProposal(RequestPrepareProposal) returns (ResponsePrepareProposal);
rpc ProcessProposal(RequestProcessProposal) returns (ResponseProcessProposal);
rpc ExtendVote(RequestExtendVote) returns (ResponseExtendVote);
diff --git a/spec/abci++/api.md b/spec/abci++/api.md
index abc33a6eb7..8d10026a8c 100644
--- a/spec/abci++/api.md
+++ b/spec/abci++/api.md
@@ -1395,6 +1395,7 @@ TxAction contains App-provided information on what to do with a transaction that
| OfferSnapshot | [RequestOfferSnapshot](#tendermint-abci-RequestOfferSnapshot) | [ResponseOfferSnapshot](#tendermint-abci-ResponseOfferSnapshot) | |
| LoadSnapshotChunk | [RequestLoadSnapshotChunk](#tendermint-abci-RequestLoadSnapshotChunk) | [ResponseLoadSnapshotChunk](#tendermint-abci-ResponseLoadSnapshotChunk) | |
| ApplySnapshotChunk | [RequestApplySnapshotChunk](#tendermint-abci-RequestApplySnapshotChunk) | [ResponseApplySnapshotChunk](#tendermint-abci-ResponseApplySnapshotChunk) | |
+| FinalizeSnapshot | [RequestFinalizeSnapshot](#tendermint-abci-RequestFinalizeSnapshot) | [ResponseFinalizeSnapshot](#tendermint-abci-ResponseFinalizeSnapshot) | |
| PrepareProposal | [RequestPrepareProposal](#tendermint-abci-RequestPrepareProposal) | [ResponsePrepareProposal](#tendermint-abci-ResponsePrepareProposal) | |
| ProcessProposal | [RequestProcessProposal](#tendermint-abci-RequestProcessProposal) | [ResponseProcessProposal](#tendermint-abci-ResponseProcessProposal) | |
| ExtendVote | [RequestExtendVote](#tendermint-abci-RequestExtendVote) | [ResponseExtendVote](#tendermint-abci-ResponseExtendVote) | |
From 012586748e6ddab4d975de675ac954eee455d024 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Thu, 16 Jan 2025 14:35:40 +0100
Subject: [PATCH 10/42] chore: fix build
---
internal/proxy/client.go | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/internal/proxy/client.go b/internal/proxy/client.go
index 9421d6b8ea..a4fa986cf4 100644
--- a/internal/proxy/client.go
+++ b/internal/proxy/client.go
@@ -212,6 +212,11 @@ func (app *proxyClient) ApplySnapshotChunk(ctx context.Context, req *types.Reque
return app.client.ApplySnapshotChunk(ctx, req)
}
+func (app *proxyClient) FinalizeSnapshot(ctx context.Context, req *types.RequestFinalizeSnapshot) (r *types.ResponseFinalizeSnapshot, err error) {
+ defer addTimeSample(app.metrics.MethodTiming.With("method", "finalize_snapshot", "type", "sync"))(&err)
+ return app.client.FinalizeSnapshot(ctx, req)
+}
+
// addTimeSample returns a function that, when called, adds an observation to m.
// The observation added to m is the number of seconds ellapsed since addTimeSample
// was initially called. addTimeSample is meant to be called in a defer to calculate
From 1afb8be4dc53346ce9b50b92f25482f37702d5ac Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Fri, 17 Jan 2025 11:06:10 +0100
Subject: [PATCH 11/42] test(e2e): test finalize snapshot in e2e tests
---
abci/example/kvstore/kvstore.go | 17 +++++++++++++++++
test/e2e/networks/rotate.toml | 4 ++--
test/e2e/pkg/mockcoreserver/methods.go | 2 +-
test/e2e/runner/setup.go | 6 +++++-
types/quorum_sign_data.go | 2 +-
5 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/abci/example/kvstore/kvstore.go b/abci/example/kvstore/kvstore.go
index bf952d5ab4..66b01ab1e4 100644
--- a/abci/example/kvstore/kvstore.go
+++ b/abci/example/kvstore/kvstore.go
@@ -579,6 +579,23 @@ func (app *Application) ApplySnapshotChunk(_ context.Context, req *abci.RequestA
app.logger.Debug("ApplySnapshotChunk", "resp", resp)
return resp, nil
}
+
+func (app *Application) FinalizeSnapshot(ctx context.Context, req *abci.RequestFinalizeSnapshot) (*abci.ResponseFinalizeSnapshot, error) {
+ app.mu.Lock()
+ defer app.mu.Unlock()
+
+ // we only verify the snapshot
+ if app.LastCommittedState.GetHeight() != req.LightBlock.SignedHeader.Header.Height {
+ return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot height mismatch")
+ }
+
+ if !app.LastCommittedState.GetAppHash().Equal(req.LightBlock.SignedHeader.Header.AppHash) {
+ return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot apphash mismatch")
+ }
+
+ app.logger.Info("FinalizeSnapshot finished successfully", "req", req)
+ return &abci.ResponseFinalizeSnapshot{}, nil
+}
func (app *Application) appVersionForHeight(height int64) uint64 {
if app.appVersion == 0 {
return uint64(height)
diff --git a/test/e2e/networks/rotate.toml b/test/e2e/networks/rotate.toml
index 2e725ec190..30f6943097 100644
--- a/test/e2e/networks/rotate.toml
+++ b/test/e2e/networks/rotate.toml
@@ -152,7 +152,7 @@ start_at = 1005 # Becomes part of the validator set at 1030 to ensure ther
seeds = ["seed01"]
snapshot_interval = 5
block_sync = "v0"
-#state_sync = "p2p"
+state_sync = "p2p"
#persistent_peers = ["validator01", "validator02", "validator03", "validator04", "validator05", "validator07", "validator08"]
perturb = ["pause", "disconnect", "restart"]
privval_protocol = "dashcore"
@@ -192,7 +192,7 @@ privval_protocol = "dashcore"
start_at = 1030
mode = "full"
block_sync = "v0"
-#state_sync = "rpc"
+state_sync = "p2p"
persistent_peers = [
"validator01",
"validator02",
diff --git a/test/e2e/pkg/mockcoreserver/methods.go b/test/e2e/pkg/mockcoreserver/methods.go
index 5894dfa867..b38f17982b 100644
--- a/test/e2e/pkg/mockcoreserver/methods.go
+++ b/test/e2e/pkg/mockcoreserver/methods.go
@@ -64,8 +64,8 @@ func WithQuorumVerifyMethod(cs CoreServer, times int) MethodFunc {
&cmd.LLMQType,
&cmd.RequestID,
&cmd.MessageHash,
- &cmd.QuorumHash,
&cmd.Signature,
+ &cmd.QuorumHash,
)
if err != nil {
return nil, err
diff --git a/test/e2e/runner/setup.go b/test/e2e/runner/setup.go
index b15302408a..77665e932e 100644
--- a/test/e2e/runner/setup.go
+++ b/test/e2e/runner/setup.go
@@ -455,6 +455,10 @@ func MakeAppConfig(node *e2e.Node) ([]byte, error) {
}
// UpdateConfigStateSync updates the state sync config for a node.
+// Arguments:
+// - node: the node to update
+// - height: the height to trust
+// - hash: the hash of the block at `height` to trust
func UpdateConfigStateSync(node *e2e.Node, height int64, hash []byte) error {
cfgPath := filepath.Join(node.Testnet.Dir, node.Name, "config", "config.toml")
@@ -464,7 +468,7 @@ func UpdateConfigStateSync(node *e2e.Node, height int64, hash []byte) error {
if err != nil {
return err
}
- bz = regexp.MustCompile(`(?m)^trust-height =.*`).ReplaceAll(bz, []byte(fmt.Sprintf(`trust-height = %v`, height-1)))
+ bz = regexp.MustCompile(`(?m)^trust-height =.*`).ReplaceAll(bz, []byte(fmt.Sprintf(`trust-height = %v`, height)))
bz = regexp.MustCompile(`(?m)^trust-hash =.*`).ReplaceAll(bz, []byte(fmt.Sprintf(`trust-hash = "%X"`, hash)))
//nolint: gosec
// G306: Expect WriteFile permissions to be 0600 or less
diff --git a/types/quorum_sign_data.go b/types/quorum_sign_data.go
index 1bd51c6224..ee73d4b46b 100644
--- a/types/quorum_sign_data.go
+++ b/types/quorum_sign_data.go
@@ -161,7 +161,7 @@ func (i *SignItem) Validate() error {
if len(i.MsgHash) != crypto.DefaultHashSize {
return fmt.Errorf("invalid hash size %d: %X", len(i.MsgHash), i.MsgHash)
}
- if len(i.QuorumHash) != crypto.DefaultHashSize {
+ if len(i.QuorumHash) != crypto.QuorumHashSize {
return fmt.Errorf("invalid quorum hash size %d: %X", len(i.QuorumHash), i.QuorumHash)
}
// Msg is optional
From 4e999db4953de7b7ca25f636b1930d54b47457d6 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Fri, 17 Jan 2025 11:47:06 +0100
Subject: [PATCH 12/42] refactor: remove trust-height and
---
abci/example/kvstore/kvstore.go | 6 +++---
internal/statesync/reactor.go | 6 +++---
internal/statesync/reactor_test.go | 2 +-
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/abci/example/kvstore/kvstore.go b/abci/example/kvstore/kvstore.go
index 66b01ab1e4..af33b3cffb 100644
--- a/abci/example/kvstore/kvstore.go
+++ b/abci/example/kvstore/kvstore.go
@@ -580,11 +580,11 @@ func (app *Application) ApplySnapshotChunk(_ context.Context, req *abci.RequestA
return resp, nil
}
-func (app *Application) FinalizeSnapshot(ctx context.Context, req *abci.RequestFinalizeSnapshot) (*abci.ResponseFinalizeSnapshot, error) {
+func (app *Application) FinalizeSnapshot(_ctx context.Context, req *abci.RequestFinalizeSnapshot) (*abci.ResponseFinalizeSnapshot, error) {
app.mu.Lock()
defer app.mu.Unlock()
- // we only verify the snapshot
+ // we verify snapshot height and app hash, as there is no additional logic to be called here
if app.LastCommittedState.GetHeight() != req.LightBlock.SignedHeader.Header.Height {
return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot height mismatch")
}
@@ -593,7 +593,7 @@ func (app *Application) FinalizeSnapshot(ctx context.Context, req *abci.RequestF
return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot apphash mismatch")
}
- app.logger.Info("FinalizeSnapshot finished successfully", "req", req)
+ app.logger.Debug("FinalizeSnapshot finished successfully", "req", req)
return &abci.ResponseFinalizeSnapshot{}, nil
}
func (app *Application) appVersionForHeight(height int64) uint64 {
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index d0219746d6..15446881b8 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -122,7 +122,7 @@ type Reactor struct {
initSyncer func() *syncer
requestSnaphot func() error
syncer *syncer // syncer is nil when sync is not in progress
- initStateProvider func(ctx context.Context, chainID string, initialHeight int64, initialBlockHash []byte) error
+ initStateProvider func(ctx context.Context, chainID string, initialHeight int64) error
stateProvider StateProvider
eventBus *eventbus.EventBus
@@ -234,7 +234,7 @@ func (r *Reactor) OnStart(ctx context.Context) error {
}
r.sendBlockError = blockCh.SendError
- r.initStateProvider = func(ctx context.Context, chainID string, initialHeight int64, initialBlockHash []byte) error {
+ r.initStateProvider = func(ctx context.Context, chainID string, initialHeight int64) error {
spLogger := r.logger.With("module", "stateprovider")
spLogger.Info("initializing state provider",
"trustHeight", r.cfg.TrustHeight, "useP2P", r.cfg.UseP2P)
@@ -386,7 +386,7 @@ func (r *Reactor) startStateProvider(ctx context.Context) error {
var err error
for retry := 0; retry < initStateProviderRetries; retry++ {
initCtx, cancel := context.WithTimeout(ctx, initStateProviderTimeout)
- err = r.initStateProvider(initCtx, r.chainID, r.initialHeight, r.cfg.TrustHashBytes())
+ err = r.initStateProvider(initCtx, r.chainID, r.initialHeight)
cancel()
if err == nil { // success
diff --git a/internal/statesync/reactor_test.go b/internal/statesync/reactor_test.go
index c115dd5db9..eff91961c4 100644
--- a/internal/statesync/reactor_test.go
+++ b/internal/statesync/reactor_test.go
@@ -625,7 +625,7 @@ func TestReactor_StateProviderP2P(t *testing.T) {
ictx, cancel := context.WithTimeout(ctx, time.Second)
defer cancel()
- err := rts.reactor.initStateProvider(ictx, factory.DefaultTestChainID, 1, nil)
+ err := rts.reactor.initStateProvider(ictx, factory.DefaultTestChainID, 1)
require.NoError(t, err)
rts.reactor.getSyncer().stateProvider = rts.reactor.stateProvider
From 63fb155a8d179284af47eeea6e4ec68bd92622ec Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Fri, 17 Jan 2025 11:57:38 +0100
Subject: [PATCH 13/42] chore(config)!: remove unused
trust-height,trust-hash,trust-period
---
config/config.go | 37 -----------------------------
config/toml.go | 9 -------
internal/statesync/reactor.go | 8 +++----
internal/statesync/reactor_test.go | 4 ----
internal/statesync/stateprovider.go | 9 ++-----
light/client.go | 12 +++-------
light/client_test.go | 14 +----------
light/example_test.go | 5 ----
light/light_test.go | 2 --
test/e2e/runner/setup.go | 22 -----------------
test/e2e/runner/start.go | 16 +------------
11 files changed, 10 insertions(+), 128 deletions(-)
diff --git a/config/config.go b/config/config.go
index ac43d04413..97ee0f79b0 100644
--- a/config/config.go
+++ b/config/config.go
@@ -1,7 +1,6 @@
package config
import (
- "encoding/hex"
"encoding/json"
"errors"
"fmt"
@@ -1001,15 +1000,6 @@ type StateSyncConfig struct {
// with net.Dial, for example: "host.example.com:2125".
RPCServers []string `mapstructure:"rpc-servers"`
- // The hash and height of a trusted block. Must be within the trust-period.
- TrustHeight int64 `mapstructure:"trust-height"`
- TrustHash string `mapstructure:"trust-hash"`
-
- // The trust period should be set so that Tendermint can detect and gossip
- // misbehavior before it is considered expired. For chains based on the Cosmos SDK,
- // one day less than the unbonding period should suffice.
- TrustPeriod time.Duration `mapstructure:"trust-period"`
-
// Time to spend discovering snapshots before initiating a restore.
DiscoveryTime time.Duration `mapstructure:"discovery-time"`
@@ -1026,19 +1016,9 @@ type StateSyncConfig struct {
Fetchers int `mapstructure:"fetchers"`
}
-func (cfg *StateSyncConfig) TrustHashBytes() []byte {
- // validated in ValidateBasic, so we can safely panic here
- bytes, err := hex.DecodeString(cfg.TrustHash)
- if err != nil {
- panic(err)
- }
- return bytes
-}
-
// DefaultStateSyncConfig returns a default configuration for the state sync service
func DefaultStateSyncConfig() *StateSyncConfig {
return &StateSyncConfig{
- TrustPeriod: 168 * time.Hour,
DiscoveryTime: 15 * time.Second,
ChunkRequestTimeout: 15 * time.Second,
Fetchers: 4,
@@ -1074,23 +1054,6 @@ func (cfg *StateSyncConfig) ValidateBasic() error {
return errors.New("discovery time must be 0s or greater than five seconds")
}
- if cfg.TrustPeriod <= 0 {
- return errors.New("trusted-period is required")
- }
-
- if cfg.TrustHeight <= 0 {
- return errors.New("trusted-height is required")
- }
-
- if len(cfg.TrustHash) == 0 {
- return errors.New("trusted-hash is required")
- }
-
- _, err := hex.DecodeString(cfg.TrustHash)
- if err != nil {
- return fmt.Errorf("invalid trusted-hash: %w", err)
- }
-
if cfg.ChunkRequestTimeout < 5*time.Second {
return errors.New("chunk-request-timeout must be at least 5 seconds")
}
diff --git a/config/toml.go b/config/toml.go
index b6be127b28..0f67745bf1 100644
--- a/config/toml.go
+++ b/config/toml.go
@@ -495,15 +495,6 @@ use-p2p = {{ .StateSync.UseP2P }}
# for example: "host.example.com:2125"
rpc-servers = "{{ StringsJoin .StateSync.RPCServers "," }}"
-# The hash and height of a trusted block. Must be within the trust-period.
-trust-height = {{ .StateSync.TrustHeight }}
-trust-hash = "{{ .StateSync.TrustHash }}"
-
-# The trust period should be set so that Tendermint can detect and gossip misbehavior before
-# it is considered expired. For chains based on the Cosmos SDK, one day less than the unbonding
-# period should suffice.
-trust-period = "{{ .StateSync.TrustPeriod }}"
-
# Time to spend discovering snapshots before initiating a restore.
discovery-time = "{{ .StateSync.DiscoveryTime }}"
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index 15446881b8..4ed4a89f07 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -236,8 +236,7 @@ func (r *Reactor) OnStart(ctx context.Context) error {
r.initStateProvider = func(ctx context.Context, chainID string, initialHeight int64) error {
spLogger := r.logger.With("module", "stateprovider")
- spLogger.Info("initializing state provider",
- "trustHeight", r.cfg.TrustHeight, "useP2P", r.cfg.UseP2P)
+ spLogger.Info("initializing state provider", "useP2P", r.cfg.UseP2P)
if r.cfg.UseP2P {
if err := r.waitForEnoughPeers(ctx, 2); err != nil {
@@ -250,7 +249,7 @@ func (r *Reactor) OnStart(ctx context.Context) error {
providers[idx] = NewBlockProvider(p, chainID, r.dispatcher)
}
- stateProvider, err := NewP2PStateProvider(ctx, chainID, initialHeight, r.cfg.TrustHeight, r.cfg.TrustHashBytes(),
+ stateProvider, err := NewP2PStateProvider(ctx, chainID, initialHeight,
providers, paramsCh, r.logger.With("module", "stateprovider"), r.dashCoreClient)
if err != nil {
return fmt.Errorf("failed to initialize P2P state provider: %w", err)
@@ -259,8 +258,7 @@ func (r *Reactor) OnStart(ctx context.Context) error {
return nil
}
- stateProvider, err := NewRPCStateProvider(ctx, chainID, initialHeight, r.cfg.RPCServers, r.cfg.TrustHeight, r.cfg.TrustHashBytes(),
- spLogger, r.dashCoreClient)
+ stateProvider, err := NewRPCStateProvider(ctx, chainID, initialHeight, r.cfg.RPCServers, spLogger, r.dashCoreClient)
if err != nil {
return fmt.Errorf("failed to initialize RPC state provider: %w", err)
}
diff --git a/internal/statesync/reactor_test.go b/internal/statesync/reactor_test.go
index eff91961c4..951e49239f 100644
--- a/internal/statesync/reactor_test.go
+++ b/internal/statesync/reactor_test.go
@@ -277,8 +277,6 @@ func TestReactor_Sync(t *testing.T) {
// update the config to use the p2p provider
rts.reactor.cfg.UseP2P = true
- rts.reactor.cfg.TrustHeight = 1
- rts.reactor.cfg.TrustHash = fmt.Sprintf("%X", chain[1].Hash())
rts.reactor.cfg.DiscoveryTime = 1 * time.Second
// Run state sync
@@ -612,8 +610,6 @@ func TestReactor_StateProviderP2P(t *testing.T) {
go handleConsensusParamsRequest(ctx, t, rts.paramsOutCh, rts.paramsInCh, closeCh)
rts.reactor.cfg.UseP2P = true
- rts.reactor.cfg.TrustHeight = 1
- rts.reactor.cfg.TrustHash = fmt.Sprintf("%X", chain[1].Hash())
for _, p := range []types.NodeID{peerA, peerB} {
if !rts.reactor.peers.Contains(p) {
diff --git a/internal/statesync/stateprovider.go b/internal/statesync/stateprovider.go
index cd6104df52..742d3be934 100644
--- a/internal/statesync/stateprovider.go
+++ b/internal/statesync/stateprovider.go
@@ -58,8 +58,6 @@ func NewRPCStateProvider(
chainID string,
initialHeight int64,
servers []string,
- trustHeight int64,
- trustBlockHash []byte,
logger log.Logger,
dashCoreClient dashcore.Client,
) (StateProvider, error) {
@@ -80,8 +78,7 @@ func NewRPCStateProvider(
// provider used by the light client and use it to fetch consensus parameters.
providerRemotes[provider] = server
}
-
- lc, err := light.NewClientAtHeight(ctx, trustHeight, trustBlockHash, chainID, providers[0], providers[1:],
+ lc, err := light.NewClient(ctx, chainID, providers[0], providers[1:],
lightdb.New(dbm.NewMemDB()), dashCoreClient, light.Logger(logger))
if err != nil {
return nil, err
@@ -218,8 +215,6 @@ func NewP2PStateProvider(
ctx context.Context,
chainID string,
initialHeight int64,
- trustHeight int64,
- trustBlockHash []byte,
providers []lightprovider.Provider,
paramsSendCh p2p.Channel,
logger log.Logger,
@@ -229,7 +224,7 @@ func NewP2PStateProvider(
return nil, fmt.Errorf("at least 2 peers are required, got %d", len(providers))
}
- lc, err := light.NewClientAtHeight(ctx, trustHeight, trustBlockHash, chainID, providers[0], providers[1:],
+ lc, err := light.NewClient(ctx, chainID, providers[0], providers[1:],
lightdb.New(dbm.NewMemDB()), dashCoreClient, light.Logger(logger))
if err != nil {
return nil, err
diff --git a/light/client.go b/light/client.go
index 3b7366bb8e..e12e5e80ea 100644
--- a/light/client.go
+++ b/light/client.go
@@ -154,13 +154,12 @@ func NewClient(
dashCoreRPCClient dashcore.QuorumVerifier,
options ...Option) (*Client, error) {
- return NewClientAtHeight(ctx, 0, nil, chainID, primary, witnesses, trustedStore, dashCoreRPCClient, options...)
+ return NewClientAtHeight(ctx, 0, chainID, primary, witnesses, trustedStore, dashCoreRPCClient, options...)
}
func NewClientAtHeight(
ctx context.Context,
height int64,
- trustedBlockHash []byte,
chainID string,
primary provider.Provider,
witnesses []provider.Provider,
@@ -180,7 +179,7 @@ func NewClientAtHeight(
if c.latestTrustedBlock == nil && height > 0 {
c.logger.Info("Downloading trusted light block")
- if err := c.initializeAtHeight(ctx, height, trustedBlockHash); err != nil {
+ if err := c.initializeAtHeight(ctx, height); err != nil {
return nil, fmt.Errorf("initialize at height: %w", err)
}
}
@@ -262,7 +261,7 @@ func (c *Client) initialize(ctx context.Context) error {
// initializeAtHeight fetches a light block at given height from
// primary provider.
// If blockHash is not nil, it will be used to verify the block.
-func (c *Client) initializeAtHeight(ctx context.Context, height int64, blockHash []byte) error {
+func (c *Client) initializeAtHeight(ctx context.Context, height int64) error {
// 1) Fetch and verify the light block.
l, err := c.lightBlockFromPrimaryAtHeight(ctx, height)
if err != nil {
@@ -276,11 +275,6 @@ func (c *Client) initializeAtHeight(ctx context.Context, height int64, blockHash
return fmt.Errorf("validate light block: %w", err)
}
- // 1.5) Verify that block hash matches the expected hash
- if len(blockHash) > 0 && !bytes.Equal(l.Hash(), blockHash) {
- return fmt.Errorf("block hash %x does not match expected hash %x", l.Hash(), blockHash)
- }
-
// 2) Ensure the commit height is correct
if l.Height != l.Commit.Height {
return fmt.Errorf("invalid commit: height %d does not match commit height %d", l.Height, l.Commit.Height)
diff --git a/light/client_test.go b/light/client_test.go
index c60d0b226c..8bdd022b5f 100644
--- a/light/client_test.go
+++ b/light/client_test.go
@@ -138,7 +138,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockFullNode,
nil,
@@ -169,7 +168,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockFullNode,
nil,
@@ -211,7 +209,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockNode,
nil,
@@ -245,7 +242,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockNode,
nil,
@@ -289,7 +285,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockFullNode,
[]provider.Provider{mockWitnessNode},
@@ -321,7 +316,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockFullNode,
nil,
@@ -376,7 +370,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockDeadNode,
[]provider.Provider{mockFullNode},
@@ -419,7 +412,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockDeadNode1,
[]provider.Provider{mockFullNode, mockDeadNode2},
@@ -513,7 +505,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockFullNode,
[]provider.Provider{mockBadValSetNode, mockGoodWitness},
@@ -561,7 +552,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockFullNode,
[]provider.Provider{mockGoodWitness},
@@ -655,9 +645,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
- 1,
- nil,
- chainID,
+ 1, chainID,
mockBadNode,
nil,
dbs.New(dbm.NewMemDB()),
diff --git a/light/example_test.go b/light/example_test.go
index 74fcf6b41c..f58a1206be 100644
--- a/light/example_test.go
+++ b/light/example_test.go
@@ -2,7 +2,6 @@ package light_test
import (
"context"
- "encoding/hex"
"testing"
"time"
@@ -157,13 +156,9 @@ func TestClientLocalDevnet(t *testing.T) {
logger)
require.NoError(t, err)
- trusted, err := hex.DecodeString("5EA22033B1855219F7579554EE75CBB48C25CDF7DF2AD6C1FD5428C1BA74CFE4")
- require.NoError(t, err)
-
c, err := light.NewClientAtHeight(
ctx,
1,
- trusted,
CHAINID,
primary,
nil,
diff --git a/light/light_test.go b/light/light_test.go
index 82cbe6c18b..2403670bfd 100644
--- a/light/light_test.go
+++ b/light/light_test.go
@@ -70,7 +70,6 @@ func TestClientIntegration_Update(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
primary,
nil,
@@ -216,7 +215,6 @@ func TestClientStatusRPC(t *testing.T) {
c, err := light.NewClientAtHeight(ctx,
2,
- nil,
chainID,
primary,
witnesses,
diff --git a/test/e2e/runner/setup.go b/test/e2e/runner/setup.go
index 77665e932e..0ca57c2284 100644
--- a/test/e2e/runner/setup.go
+++ b/test/e2e/runner/setup.go
@@ -9,7 +9,6 @@ import (
"fmt"
"os"
"path/filepath"
- "regexp"
"sort"
"strconv"
"strings"
@@ -454,27 +453,6 @@ func MakeAppConfig(node *e2e.Node) ([]byte, error) {
return buf.Bytes(), nil
}
-// UpdateConfigStateSync updates the state sync config for a node.
-// Arguments:
-// - node: the node to update
-// - height: the height to trust
-// - hash: the hash of the block at `height` to trust
-func UpdateConfigStateSync(node *e2e.Node, height int64, hash []byte) error {
- cfgPath := filepath.Join(node.Testnet.Dir, node.Name, "config", "config.toml")
-
- // FIXME Apparently there's no function to simply load a config file without
- // involving the entire Viper apparatus, so we'll just resort to regexps.
- bz, err := os.ReadFile(cfgPath)
- if err != nil {
- return err
- }
- bz = regexp.MustCompile(`(?m)^trust-height =.*`).ReplaceAll(bz, []byte(fmt.Sprintf(`trust-height = %v`, height)))
- bz = regexp.MustCompile(`(?m)^trust-hash =.*`).ReplaceAll(bz, []byte(fmt.Sprintf(`trust-hash = "%X"`, hash)))
- //nolint: gosec
- // G306: Expect WriteFile permissions to be 0600 or less
- return os.WriteFile(cfgPath, bz, 0644)
-}
-
func newDefaultFilePV(node *e2e.Node, nodeDir string) (*privval.FilePV, error) {
return privval.NewFilePVWithOptions(
privval.WithPrivateKeysMap(node.PrivvalKeys),
diff --git a/test/e2e/runner/start.go b/test/e2e/runner/start.go
index 3b45597fb9..64c5b0ce8f 100644
--- a/test/e2e/runner/start.go
+++ b/test/e2e/runner/start.go
@@ -70,11 +70,6 @@ func Start(ctx context.Context, logger log.Logger, testnet *e2e.Testnet, ti infr
"nodes", len(testnet.Nodes)-len(nodeQueue),
"pending", len(nodeQueue))
- block, blockID, err := waitForHeight(ctx, testnet, networkHeight)
- if err != nil {
- return err
- }
-
for _, node := range nodeQueue {
if node.StartAt > networkHeight {
// if we're starting a node that's ahead of
@@ -93,16 +88,7 @@ func Start(ctx context.Context, logger log.Logger, testnet *e2e.Testnet, ti infr
networkHeight = node.StartAt
- block, blockID, err = waitForHeight(ctx, testnet, networkHeight)
- if err != nil {
- return err
- }
- }
-
- // Update any state sync nodes with a trusted height and hash
- if node.StateSync != e2e.StateSyncDisabled || node.Mode == e2e.ModeLight {
- err = UpdateConfigStateSync(node, block.Height, blockID.Hash.Bytes())
- if err != nil {
+ if _, _, err := waitForHeight(ctx, testnet, networkHeight); err != nil {
return err
}
}
From c1827ee1e1aac347fddc1d6646bf7367bd566e1e Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 08:31:40 +0100
Subject: [PATCH 14/42] test(light): remove temporarily added code
---
light/example_test.go | 86 -------------------------------------------
1 file changed, 86 deletions(-)
diff --git a/light/example_test.go b/light/example_test.go
index f58a1206be..55b93fedae 100644
--- a/light/example_test.go
+++ b/light/example_test.go
@@ -113,89 +113,3 @@ func TestExampleClient(t *testing.T) {
logger.Info("verified light block", "light-block", lb)
}
-
-// Manually getting light blocks and verifying them.
-func TestClientLocalDevnet(t *testing.T) {
- const CHAINID = "dashmate_local_12"
-
- if testing.Short() {
- t.Skip("skipping test in short mode")
- }
-
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
-
- logger, err := log.NewDefaultLogger(log.LogFormatPlain, log.LogLevelTrace)
- if err != nil {
- t.Fatal(err)
- }
-
- // Start a test application
- // app, err := kvstore.NewMemoryApp()
- // require.NoError(t, err)
-
- primary, err := httpp.New(CHAINID, "10.56.229.104:34657")
- if err != nil {
- t.Fatal(err)
- }
-
- // give Tendermint time to generate some blocks
- time.Sleep(5 * time.Second)
-
- _, err = primary.LightBlock(ctx, 1)
- if err != nil {
- t.Fatal(err)
- }
-
- db := dbm.NewMemDB()
-
- // pv, err := privval.LoadOrGenFilePV(conf.PrivValidator.KeyFile(), conf.PrivValidator.StateFile())
- require.NoError(t, err)
- coreClient, err := dashcore.NewRPCClient("10.56.229.104:30002",
- "tenderdash", "IAzIcGlDfuow",
- logger)
- require.NoError(t, err)
-
- c, err := light.NewClientAtHeight(
- ctx,
- 1,
- CHAINID,
- primary,
- nil,
- dbs.New(db),
- coreClient,
- light.Logger(logger),
- )
-
- if err != nil {
- t.Fatal(err)
- }
- defer func() {
- if err := c.Cleanup(); err != nil {
- t.Fatal(err)
- }
- }()
-
- // wait for a few more blocks to be produced
- time.Sleep(2 * time.Second)
-
- // verify the block at height 3
- _, err = c.VerifyLightBlockAtHeight(ctx, 3, time.Now())
- if err != nil {
- t.Fatal(err)
- }
-
- // retrieve light block at height 3
- _, err = c.TrustedLightBlock(3)
- if err != nil {
- t.Fatal(err)
- }
-
- // update to the latest height
- lb, err := c.Update(ctx, time.Now())
- if err != nil {
- t.Fatal(err)
- }
-
- logger.Info("verified light block", "light-block", lb)
-}
From e84e0bed2b198e7c474f48b05728753156f569b4 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 09:09:10 +0100
Subject: [PATCH 15/42] test(statesync): fix state sync tests
---
internal/statesync/reactor_test.go | 2 ++
internal/statesync/syncer_test.go | 22 ++++++++++++++++++----
2 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/internal/statesync/reactor_test.go b/internal/statesync/reactor_test.go
index 951e49239f..799f017b9a 100644
--- a/internal/statesync/reactor_test.go
+++ b/internal/statesync/reactor_test.go
@@ -236,6 +236,8 @@ func TestReactor_Sync(t *testing.T) {
Once().
Return(&abci.ResponseApplySnapshotChunk{Result: abci.ResponseApplySnapshotChunk_COMPLETE_SNAPSHOT}, nil)
+ rts.conn.On("FinalizeSnapshot", ctx, mock.Anything).Return(&abci.ResponseFinalizeSnapshot{}, nil).Once()
+
// app query returns valid state app hash
rts.conn.
On("Info", mock.Anything, &proxy.RequestInfo).
diff --git a/internal/statesync/syncer_test.go b/internal/statesync/syncer_test.go
index 0854c65122..4c116b1617 100644
--- a/internal/statesync/syncer_test.go
+++ b/internal/statesync/syncer_test.go
@@ -100,7 +100,19 @@ func (suite *SyncerTestSuite) TestSyncAny() {
ConsensusParams: *types.DefaultConsensusParams(),
LastHeightConsensusParamsChanged: 1,
}
- commit := &types.Commit{BlockID: types.BlockID{Hash: []byte("blockhash")}}
+ commit := &types.Commit{
+ Height: 1,
+ BlockID: types.BlockID{Hash: []byte("blockhash")},
+ }
+
+ lightBlock := types.LightBlock{
+ SignedHeader: &types.SignedHeader{
+ Commit: commit,
+ Header: &types.Header{
+ Height: 1,
+ },
+ },
+ }
s := &snapshot{Height: 1, Version: 1, Hash: []byte{0}}
chunks := []*chunk{
@@ -116,9 +128,8 @@ func (suite *SyncerTestSuite) TestSyncAny() {
suite.stateProvider.
On("AppHash", mock.Anything, uint64(2)).
Return(tmbytes.HexBytes("app_hash_2"), nil)
- suite.stateProvider.
- On("Commit", mock.Anything, uint64(1)).
- Return(commit, nil)
+ suite.stateProvider.On("LightBlock", mock.Anything, uint64(commit.Height)).
+ Return(&lightBlock, nil)
suite.stateProvider.
On("State", mock.Anything, uint64(1)).
Return(state, nil)
@@ -254,6 +265,9 @@ func (suite *SyncerTestSuite) TestSyncAny() {
Once().
Return(asc.resp, nil)
}
+ suite.conn.On("FinalizeSnapshot", mock.Anything, mock.Anything).
+ Once().
+ Return(&abci.ResponseFinalizeSnapshot{}, nil)
suite.conn.
On("Info", mock.Anything, &proxy.RequestInfo).
Once().
From af796974380b93f18a4d783f346fb34a81aafdce Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 09:37:19 +0100
Subject: [PATCH 16/42] chore: apply code rabbit comments
---
abci/example/kvstore/kvstore.go | 6 ++++--
abci/types/application.go | 1 +
abci/types/types.pb.go | 10 +++++++---
proto/tendermint/abci/types.proto | 11 +++++++----
spec/abci++/api.md | 10 +++++++---
5 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/abci/example/kvstore/kvstore.go b/abci/example/kvstore/kvstore.go
index af33b3cffb..7fffaa810e 100644
--- a/abci/example/kvstore/kvstore.go
+++ b/abci/example/kvstore/kvstore.go
@@ -586,11 +586,13 @@ func (app *Application) FinalizeSnapshot(_ctx context.Context, req *abci.Request
// we verify snapshot height and app hash, as there is no additional logic to be called here
if app.LastCommittedState.GetHeight() != req.LightBlock.SignedHeader.Header.Height {
- return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot height mismatch")
+ return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot height mismatch: expected %d, got %d",
+ app.LastCommittedState.GetHeight(), req.LightBlock.SignedHeader.Header.Height)
}
if !app.LastCommittedState.GetAppHash().Equal(req.LightBlock.SignedHeader.Header.AppHash) {
- return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot apphash mismatch")
+ return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot apphash mismatch: expected %x, got %x",
+ app.LastCommittedState.GetAppHash(), req.LightBlock.SignedHeader.Header.AppHash)
}
app.logger.Debug("FinalizeSnapshot finished successfully", "req", req)
diff --git a/abci/types/application.go b/abci/types/application.go
index 9000d8a884..3a19116bdc 100644
--- a/abci/types/application.go
+++ b/abci/types/application.go
@@ -99,6 +99,7 @@ func (BaseApplication) ApplySnapshotChunk(_ context.Context, _req *RequestApplyS
return &ResponseApplySnapshotChunk{}, nil
}
+// FinalizeSnapshot provides a no-op implementation for the StateSyncer interface
func (BaseApplication) FinalizeSnapshot(_ context.Context, _req *RequestFinalizeSnapshot) (*ResponseFinalizeSnapshot, error) {
return &ResponseFinalizeSnapshot{}, nil
}
diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go
index 9855779aef..246d965d1e 100644
--- a/abci/types/types.pb.go
+++ b/abci/types/types.pb.go
@@ -1174,9 +1174,13 @@ func (m *RequestApplySnapshotChunk) GetSender() string {
return ""
}
-// After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
-// It includes the light block committed at the synced height, which Tenderdash uses
-// to reconstruct its own state.
+// RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, eg.
+// when the ABCI application returned `ResponseApplySnapshotChunk` with `Result = ACCEPT`.
+// It includes the light block committed at the synced height, which Tenderdash uses to reconstruct its own state.
+// The application should validate the light block against its restored state.
+//
+// If the application fails to validate the light block, it should return error in the response.
+// This is considered fatal, non-recoverable consensus failure and will cause Tenderdash to restart.
type RequestFinalizeSnapshot struct {
// light block committed at the synced height
LightBlock *types1.LightBlock `protobuf:"bytes,1,opt,name=light_block,json=lightBlock,proto3" json:"light_block,omitempty"`
diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto
index 4a10c16abb..7cdcc3ea98 100644
--- a/proto/tendermint/abci/types.proto
+++ b/proto/tendermint/abci/types.proto
@@ -183,10 +183,13 @@ message RequestApplySnapshotChunk {
bytes chunk = 2; // The binary chunk contents, as returned by LoadSnapshotChunk.
string sender = 3; // The P2P ID of the node who sent this chunk.
}
-
-// After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
-// It includes the light block committed at the synced height, which Tenderdash uses
-// to reconstruct its own state.
+// RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, eg.
+// when the ABCI application returned `ResponseApplySnapshotChunk` with `Result = ACCEPT`.
+// It includes the light block committed at the synced height, which Tenderdash uses to reconstruct its own state.
+// The application should validate the light block against its restored state.
+//
+// If the application fails to validate the light block, it should return error in the response.
+// This is considered fatal, non-recoverable consensus failure and will cause Tenderdash to restart.
message RequestFinalizeSnapshot {
// light block committed at the synced height
tendermint.types.LightBlock light_block = 1;
diff --git a/spec/abci++/api.md b/spec/abci++/api.md
index 8d10026a8c..7be7254bea 100644
--- a/spec/abci++/api.md
+++ b/spec/abci++/api.md
@@ -429,9 +429,13 @@ Finalize newly decided block.
### RequestFinalizeSnapshot
-After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
-It includes the light block committed at the synced height, which Tenderdash uses
-to reconstruct its own state.
+RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, eg.
+when the ABCI application returned `ResponseApplySnapshotChunk` with `Result = ACCEPT`.
+It includes the light block committed at the synced height, which Tenderdash uses to reconstruct its own state.
+The application should validate the light block against its restored state.
+
+If the application fails to validate the light block, it should return error in the response.
+This is considered fatal, non-recoverable consensus failure and will cause Tenderdash to restart.
| Field | Type | Label | Description |
From a9cf16f985e336cf7744a7e7b49f411c47cb900d Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 10:53:54 +0100
Subject: [PATCH 17/42] chore: self review
---
abci/types/types.pb.go | 2 +-
light/client.go | 1 -
light/client_test.go | 3 ++-
proto/tendermint/abci/types.proto | 2 +-
spec/abci++/api.md | 2 +-
5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go
index 246d965d1e..00cbfc9108 100644
--- a/abci/types/types.pb.go
+++ b/abci/types/types.pb.go
@@ -1174,7 +1174,7 @@ func (m *RequestApplySnapshotChunk) GetSender() string {
return ""
}
-// RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, eg.
+// RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, e.g.
// when the ABCI application returned `ResponseApplySnapshotChunk` with `Result = ACCEPT`.
// It includes the light block committed at the synced height, which Tenderdash uses to reconstruct its own state.
// The application should validate the light block against its restored state.
diff --git a/light/client.go b/light/client.go
index e12e5e80ea..e2e10487ec 100644
--- a/light/client.go
+++ b/light/client.go
@@ -260,7 +260,6 @@ func (c *Client) initialize(ctx context.Context) error {
// initializeAtHeight fetches a light block at given height from
// primary provider.
-// If blockHash is not nil, it will be used to verify the block.
func (c *Client) initializeAtHeight(ctx context.Context, height int64) error {
// 1) Fetch and verify the light block.
l, err := c.lightBlockFromPrimaryAtHeight(ctx, height)
diff --git a/light/client_test.go b/light/client_test.go
index 8bdd022b5f..8dbecbe852 100644
--- a/light/client_test.go
+++ b/light/client_test.go
@@ -645,7 +645,8 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
- 1, chainID,
+ 1,
+ chainID,
mockBadNode,
nil,
dbs.New(dbm.NewMemDB()),
diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto
index 7cdcc3ea98..4b67f05b38 100644
--- a/proto/tendermint/abci/types.proto
+++ b/proto/tendermint/abci/types.proto
@@ -183,7 +183,7 @@ message RequestApplySnapshotChunk {
bytes chunk = 2; // The binary chunk contents, as returned by LoadSnapshotChunk.
string sender = 3; // The P2P ID of the node who sent this chunk.
}
-// RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, eg.
+// RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, e.g.
// when the ABCI application returned `ResponseApplySnapshotChunk` with `Result = ACCEPT`.
// It includes the light block committed at the synced height, which Tenderdash uses to reconstruct its own state.
// The application should validate the light block against its restored state.
diff --git a/spec/abci++/api.md b/spec/abci++/api.md
index 7be7254bea..c1310169fc 100644
--- a/spec/abci++/api.md
+++ b/spec/abci++/api.md
@@ -429,7 +429,7 @@ Finalize newly decided block.
### RequestFinalizeSnapshot
-RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, eg.
+RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, e.g.
when the ABCI application returned `ResponseApplySnapshotChunk` with `Result = ACCEPT`.
It includes the light block committed at the synced height, which Tenderdash uses to reconstruct its own state.
The application should validate the light block against its restored state.
From bc399c86d5c2da08164397513c2d572a0889a2ea Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 12:37:21 +0100
Subject: [PATCH 18/42] deps: update dashd-go
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 472ec381c0..da7cf2579b 100644
--- a/go.mod
+++ b/go.mod
@@ -9,7 +9,7 @@ require (
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce
github.com/containerd/continuity v0.4.4 // indirect
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8
- github.com/dashpay/dashd-go v0.26.1-0.20250113154619-015ef93ad36e
+ github.com/dashpay/dashd-go v0.26.1-0.20250120111006-f2e635c9e191
github.com/dashpay/dashd-go/btcec/v2 v2.2.0 // indirect
github.com/fortytw2/leaktest v1.3.0
github.com/fxamacker/cbor/v2 v2.4.0
diff --git a/go.sum b/go.sum
index d136be00f1..9384673449 100644
--- a/go.sum
+++ b/go.sum
@@ -218,8 +218,8 @@ github.com/daixiang0/gci v0.13.5 h1:kThgmH1yBmZSBCh1EJVxQ7JsHpm5Oms0AMed/0LaH4c=
github.com/daixiang0/gci v0.13.5/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk=
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8 h1:v4K3CiDoFY1gjcWL/scRcwzyjBwh8TVG3ek8cWolK1g=
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8/go.mod h1:auvGS60NBZ+a21aCCQh366PdsjDvHinsCvl28VrYPu4=
-github.com/dashpay/dashd-go v0.26.1-0.20250113154619-015ef93ad36e h1:VAyUrB9BWe05tSuEx5xW0LsxBtm4TPltetB0BwFHVEs=
-github.com/dashpay/dashd-go v0.26.1-0.20250113154619-015ef93ad36e/go.mod h1:7KKS2jSPkC1pTz9WLXpiXZ96wT5bUqKTRuk35AyRQ74=
+github.com/dashpay/dashd-go v0.26.1-0.20250120111006-f2e635c9e191 h1:+3tjhUhU3pDxp7Wn6IefE+K744UckDVdUywro2l1FW8=
+github.com/dashpay/dashd-go v0.26.1-0.20250120111006-f2e635c9e191/go.mod h1:7KKS2jSPkC1pTz9WLXpiXZ96wT5bUqKTRuk35AyRQ74=
github.com/dashpay/dashd-go/btcec/v2 v2.2.0 h1:tk54BC++OvOUu0vcPoG8+45dGoJXKsmupYAawBO/1Vk=
github.com/dashpay/dashd-go/btcec/v2 v2.2.0/go.mod h1:uOmCM/hVoJ1x6w+3SX+zQv+2LdrK3aO59RV41jNvTF4=
github.com/dashpay/dashd-go/btcutil v1.3.0 h1:yDX8tz7C/KhFHbGlRXBpNN+zlkmAgwkICD9DlAv/Vsc=
From 34936f9debd8992fa1c836172d46fcbb880100be Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 12:52:13 +0100
Subject: [PATCH 19/42] deps: update dashd-go
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index da7cf2579b..569b362258 100644
--- a/go.mod
+++ b/go.mod
@@ -9,7 +9,7 @@ require (
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce
github.com/containerd/continuity v0.4.4 // indirect
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8
- github.com/dashpay/dashd-go v0.26.1-0.20250120111006-f2e635c9e191
+ github.com/dashpay/dashd-go v0.26.1-0.20250120114940-580cb9149de7
github.com/dashpay/dashd-go/btcec/v2 v2.2.0 // indirect
github.com/fortytw2/leaktest v1.3.0
github.com/fxamacker/cbor/v2 v2.4.0
diff --git a/go.sum b/go.sum
index 9384673449..e896391b6b 100644
--- a/go.sum
+++ b/go.sum
@@ -218,8 +218,8 @@ github.com/daixiang0/gci v0.13.5 h1:kThgmH1yBmZSBCh1EJVxQ7JsHpm5Oms0AMed/0LaH4c=
github.com/daixiang0/gci v0.13.5/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk=
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8 h1:v4K3CiDoFY1gjcWL/scRcwzyjBwh8TVG3ek8cWolK1g=
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8/go.mod h1:auvGS60NBZ+a21aCCQh366PdsjDvHinsCvl28VrYPu4=
-github.com/dashpay/dashd-go v0.26.1-0.20250120111006-f2e635c9e191 h1:+3tjhUhU3pDxp7Wn6IefE+K744UckDVdUywro2l1FW8=
-github.com/dashpay/dashd-go v0.26.1-0.20250120111006-f2e635c9e191/go.mod h1:7KKS2jSPkC1pTz9WLXpiXZ96wT5bUqKTRuk35AyRQ74=
+github.com/dashpay/dashd-go v0.26.1-0.20250120114940-580cb9149de7 h1:Er4zUGcd9UKXBPCbLBaclSxsMNUsK3fW2elJGTYSnJs=
+github.com/dashpay/dashd-go v0.26.1-0.20250120114940-580cb9149de7/go.mod h1:7KKS2jSPkC1pTz9WLXpiXZ96wT5bUqKTRuk35AyRQ74=
github.com/dashpay/dashd-go/btcec/v2 v2.2.0 h1:tk54BC++OvOUu0vcPoG8+45dGoJXKsmupYAawBO/1Vk=
github.com/dashpay/dashd-go/btcec/v2 v2.2.0/go.mod h1:uOmCM/hVoJ1x6w+3SX+zQv+2LdrK3aO59RV41jNvTF4=
github.com/dashpay/dashd-go/btcutil v1.3.0 h1:yDX8tz7C/KhFHbGlRXBpNN+zlkmAgwkICD9DlAv/Vsc=
From 8726abb8b5147b88ae69c58cb76d74978f194d99 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 13:28:30 +0100
Subject: [PATCH 20/42] chore: add genesis block to finalizesnapshot
---
abci/types/types.pb.go | 602 ++++++++++++++++--------------
internal/statesync/syncer.go | 25 +-
light/example_test.go | 86 +++++
proto/tendermint/abci/types.proto | 6 +-
spec/abci++/api.md | 3 +-
5 files changed, 444 insertions(+), 278 deletions(-)
diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go
index 00cbfc9108..4d650aed85 100644
--- a/abci/types/types.pb.go
+++ b/abci/types/types.pb.go
@@ -1182,8 +1182,10 @@ func (m *RequestApplySnapshotChunk) GetSender() string {
// If the application fails to validate the light block, it should return error in the response.
// This is considered fatal, non-recoverable consensus failure and will cause Tenderdash to restart.
type RequestFinalizeSnapshot struct {
- // light block committed at the synced height
- LightBlock *types1.LightBlock `protobuf:"bytes,1,opt,name=light_block,json=lightBlock,proto3" json:"light_block,omitempty"`
+ // Snapshot block is a block at which the snapshot was taken.
+ SnapshotBlock *types1.LightBlock `protobuf:"bytes,1,opt,name=snapshot_block,json=snapshotBlock,proto3" json:"snapshot_block,omitempty"`
+ // Genesis block is the first block of the chain
+ GenesisBlock *types1.LightBlock `protobuf:"bytes,2,opt,name=genesis_block,json=genesisBlock,proto3" json:"genesis_block,omitempty"`
}
func (m *RequestFinalizeSnapshot) Reset() { *m = RequestFinalizeSnapshot{} }
@@ -1219,9 +1221,16 @@ func (m *RequestFinalizeSnapshot) XXX_DiscardUnknown() {
var xxx_messageInfo_RequestFinalizeSnapshot proto.InternalMessageInfo
-func (m *RequestFinalizeSnapshot) GetLightBlock() *types1.LightBlock {
+func (m *RequestFinalizeSnapshot) GetSnapshotBlock() *types1.LightBlock {
if m != nil {
- return m.LightBlock
+ return m.SnapshotBlock
+ }
+ return nil
+}
+
+func (m *RequestFinalizeSnapshot) GetGenesisBlock() *types1.LightBlock {
+ if m != nil {
+ return m.GenesisBlock
}
return nil
}
@@ -4489,245 +4498,246 @@ func init() {
func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) }
var fileDescriptor_252557cfdd89a31a = []byte{
- // 3796 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4d, 0x70, 0x1b, 0x57,
- 0x72, 0xc6, 0xe0, 0x1f, 0x8d, 0xbf, 0xe1, 0x23, 0x25, 0x41, 0x90, 0x44, 0x72, 0x47, 0xf1, 0x4a,
- 0xab, 0xb5, 0x49, 0xaf, 0x14, 0xaf, 0xec, 0xec, 0x6e, 0xaa, 0x40, 0x10, 0x0a, 0x48, 0x51, 0x24,
- 0x3d, 0x04, 0xa9, 0x75, 0x1c, 0x7b, 0x6a, 0x08, 0x3c, 0x02, 0x63, 0x01, 0x98, 0xf1, 0xcc, 0x80,
- 0x02, 0x7d, 0x4d, 0x52, 0x95, 0xf2, 0xc9, 0xf7, 0x94, 0x6f, 0xc9, 0x31, 0xf7, 0x9c, 0x92, 0x5b,
- 0xe2, 0x54, 0x2e, 0x3e, 0xa6, 0x2a, 0x55, 0x8a, 0x4b, 0xbe, 0xe5, 0xe6, 0x53, 0x2e, 0x39, 0xa4,
- 0xde, 0xcf, 0xfc, 0x02, 0x83, 0x1f, 0xcb, 0x55, 0xa9, 0xbd, 0xe1, 0xf5, 0xeb, 0xee, 0x79, 0x3f,
- 0xfd, 0xba, 0xfb, 0x7d, 0xfd, 0x00, 0xb7, 0x6c, 0x3c, 0xec, 0x60, 0x73, 0xa0, 0x0d, 0xed, 0x6d,
- 0xf5, 0xbc, 0xad, 0x6d, 0xdb, 0x57, 0x06, 0xb6, 0xb6, 0x0c, 0x53, 0xb7, 0x75, 0x54, 0xf6, 0x3a,
- 0xb7, 0x48, 0x67, 0xf5, 0x8e, 0x8f, 0xbb, 0x6d, 0x5e, 0x19, 0xb6, 0xbe, 0x6d, 0x98, 0xba, 0x7e,
- 0xc1, 0xf8, 0xab, 0x7e, 0x65, 0x54, 0xcf, 0x76, 0x47, 0xb5, 0x7a, 0xbc, 0xf3, 0xf6, 0x44, 0xe7,
- 0x79, 0x5f, 0x6f, 0xbf, 0x88, 0xec, 0xf5, 0x0d, 0x24, 0xd0, 0xcb, 0xbf, 0xfb, 0x02, 0x5f, 0x39,
- 0xbd, 0x77, 0x26, 0x64, 0x0d, 0xd5, 0x54, 0x07, 0x4e, 0xf7, 0xba, 0xaf, 0xfb, 0x12, 0x9b, 0x96,
- 0xa6, 0x0f, 0x03, 0xca, 0x37, 0xba, 0xba, 0xde, 0xed, 0xe3, 0x6d, 0xda, 0x3a, 0x1f, 0x5d, 0x6c,
- 0xdb, 0xda, 0x00, 0x5b, 0xb6, 0x3a, 0x30, 0x38, 0xc3, 0x5a, 0x57, 0xef, 0xea, 0xf4, 0xe7, 0x36,
- 0xf9, 0xc5, 0xa8, 0xd2, 0xab, 0x1c, 0x64, 0x64, 0xfc, 0xf9, 0x08, 0x5b, 0x36, 0x7a, 0x08, 0x49,
- 0xdc, 0xee, 0xe9, 0x15, 0x61, 0x53, 0xb8, 0x9f, 0x7f, 0x78, 0x7b, 0x2b, 0xb4, 0x6e, 0x5b, 0x9c,
- 0xaf, 0xd1, 0xee, 0xe9, 0xcd, 0x98, 0x4c, 0x79, 0xd1, 0x7b, 0x90, 0xba, 0xe8, 0x8f, 0xac, 0x5e,
- 0x25, 0x4e, 0x85, 0xee, 0x44, 0x09, 0x3d, 0x21, 0x4c, 0xcd, 0x98, 0xcc, 0xb8, 0xc9, 0xa7, 0xb4,
- 0xe1, 0x85, 0x5e, 0x49, 0xcc, 0xfe, 0xd4, 0xde, 0xf0, 0x82, 0x7e, 0x8a, 0xf0, 0xa2, 0x1d, 0x00,
- 0x6d, 0xa8, 0xd9, 0x4a, 0xbb, 0xa7, 0x6a, 0xc3, 0x4a, 0x92, 0x4a, 0xfe, 0x2c, 0x5a, 0x52, 0xb3,
- 0xeb, 0x84, 0xb1, 0x19, 0x93, 0x73, 0x9a, 0xd3, 0x20, 0xc3, 0xfd, 0x7c, 0x84, 0xcd, 0xab, 0x4a,
- 0x6a, 0xf6, 0x70, 0x3f, 0x24, 0x4c, 0x64, 0xb8, 0x94, 0x1b, 0xfd, 0x16, 0xb2, 0xed, 0x1e, 0x6e,
- 0xbf, 0x50, 0xec, 0x71, 0x25, 0x43, 0x25, 0x37, 0xa2, 0x24, 0xeb, 0x84, 0xaf, 0x35, 0x6e, 0xc6,
- 0xe4, 0x4c, 0x9b, 0xfd, 0x44, 0x87, 0x50, 0xea, 0x6b, 0x96, 0xad, 0x58, 0x43, 0xd5, 0xb0, 0x7a,
- 0xba, 0x6d, 0x55, 0xf2, 0x54, 0xc7, 0x5b, 0x51, 0x3a, 0x0e, 0x34, 0xcb, 0x3e, 0x71, 0x98, 0x9b,
- 0x31, 0xb9, 0xd8, 0xf7, 0x13, 0x88, 0x3e, 0xfd, 0xe2, 0x02, 0x9b, 0xae, 0xc2, 0x4a, 0x61, 0xb6,
- 0xbe, 0x23, 0xc2, 0xed, 0xc8, 0x13, 0x7d, 0xba, 0x9f, 0x80, 0x3e, 0x86, 0xd5, 0xbe, 0xae, 0x76,
- 0x5c, 0x75, 0x4a, 0xbb, 0x37, 0x1a, 0xbe, 0xa8, 0x14, 0xa9, 0xd2, 0x5f, 0x44, 0x0e, 0x52, 0x57,
- 0x3b, 0x8e, 0x8a, 0x3a, 0x11, 0x68, 0xc6, 0xe4, 0x95, 0x7e, 0x98, 0x88, 0x3e, 0x85, 0x35, 0xd5,
- 0x30, 0xfa, 0x57, 0x61, 0xed, 0x25, 0xaa, 0xfd, 0x41, 0x94, 0xf6, 0x1a, 0x91, 0x09, 0xab, 0x47,
- 0xea, 0x04, 0x15, 0x3d, 0x87, 0x95, 0x0b, 0x6d, 0xa8, 0xf6, 0xb5, 0x2f, 0xb0, 0xb7, 0x1e, 0x6b,
- 0x54, 0xf9, 0xfd, 0x48, 0x63, 0xe4, 0x02, 0xbe, 0x25, 0x11, 0x2f, 0x42, 0x34, 0xd4, 0x02, 0xd1,
- 0x30, 0xb1, 0xa1, 0x9a, 0x58, 0x31, 0x4c, 0xdd, 0xd0, 0x2d, 0xb5, 0x5f, 0x29, 0x53, 0xbd, 0xf7,
- 0xa2, 0xf4, 0x1e, 0x33, 0xfe, 0x63, 0xce, 0xde, 0x8c, 0xc9, 0x65, 0x23, 0x48, 0x62, 0x5a, 0xf5,
- 0x36, 0xb6, 0x2c, 0x4f, 0xab, 0x38, 0x4f, 0x2b, 0xe5, 0x0f, 0x6a, 0x0d, 0x90, 0x50, 0x03, 0xf2,
- 0x78, 0x4c, 0xc4, 0x95, 0x4b, 0xdd, 0xc6, 0x95, 0x15, 0xaa, 0x50, 0x8a, 0x3c, 0xc0, 0x94, 0xf5,
- 0x4c, 0xb7, 0x71, 0x33, 0x26, 0x03, 0x76, 0x5b, 0x48, 0x85, 0x6b, 0x97, 0xd8, 0xd4, 0x2e, 0xae,
- 0xa8, 0x1a, 0x85, 0xf6, 0x10, 0x47, 0x53, 0x41, 0x54, 0xe1, 0x2f, 0xa3, 0x14, 0x9e, 0x51, 0x21,
- 0xa2, 0xa2, 0xe1, 0x88, 0x34, 0x63, 0xf2, 0xea, 0xe5, 0x24, 0x99, 0xd8, 0xae, 0xbb, 0x5d, 0xd4,
- 0x73, 0x56, 0x56, 0x67, 0xdb, 0xae, 0xb3, 0x57, 0x3b, 0x84, 0x99, 0xd8, 0xee, 0x85, 0x9f, 0xb0,
- 0x93, 0x81, 0xd4, 0xa5, 0xda, 0x1f, 0xe1, 0xfd, 0x64, 0x36, 0x2d, 0x66, 0xf6, 0x93, 0xd9, 0xac,
- 0x98, 0xdb, 0x4f, 0x66, 0x73, 0x22, 0xec, 0x27, 0xb3, 0x20, 0xe6, 0xa5, 0x7b, 0x90, 0xf7, 0xf9,
- 0x2d, 0x54, 0x81, 0xcc, 0x00, 0x5b, 0x96, 0xda, 0xc5, 0xd4, 0xcd, 0xe5, 0x64, 0xa7, 0x29, 0x95,
- 0xa0, 0xe0, 0xf7, 0x55, 0xd2, 0x57, 0x82, 0x2b, 0x49, 0xdc, 0x10, 0x91, 0xe4, 0x7e, 0xd7, 0x91,
- 0xe4, 0x4d, 0x74, 0x17, 0x8a, 0x74, 0x2a, 0x8a, 0xd3, 0x4f, 0x7c, 0x61, 0x52, 0x2e, 0x50, 0xe2,
- 0x19, 0x67, 0xda, 0x80, 0xbc, 0xf1, 0xd0, 0x70, 0x59, 0x12, 0x94, 0x05, 0x8c, 0x87, 0x86, 0xc3,
- 0xf0, 0x33, 0x28, 0x90, 0x79, 0xbb, 0x1c, 0x49, 0xfa, 0x91, 0x3c, 0xa1, 0x71, 0x16, 0xe9, 0xaf,
- 0x12, 0x20, 0x86, 0xfd, 0x1b, 0x7a, 0x1f, 0x92, 0xc4, 0xd5, 0x73, 0xaf, 0x5d, 0xdd, 0x62, 0x71,
- 0x60, 0xcb, 0x89, 0x03, 0x5b, 0x2d, 0x27, 0x0e, 0xec, 0x64, 0xbf, 0x79, 0xb5, 0x11, 0xfb, 0xea,
- 0xbf, 0x36, 0x04, 0x99, 0x4a, 0xa0, 0x9b, 0xc4, 0xab, 0xa9, 0xda, 0x50, 0xd1, 0x3a, 0x74, 0xc8,
- 0x39, 0xe2, 0xb2, 0x54, 0x6d, 0xb8, 0xd7, 0x41, 0x07, 0x20, 0xb6, 0xf5, 0xa1, 0x85, 0x87, 0xd6,
- 0xc8, 0x52, 0x58, 0x1c, 0xe2, 0xbe, 0x3a, 0xe0, 0x71, 0x59, 0x00, 0xaa, 0x3b, 0x9c, 0xc7, 0x94,
- 0x51, 0x2e, 0xb7, 0x83, 0x04, 0x74, 0x08, 0xc5, 0x4b, 0xb5, 0xaf, 0x75, 0x54, 0x5b, 0x37, 0x15,
- 0x0b, 0xdb, 0xdc, 0x79, 0xdf, 0x9d, 0xd8, 0xf3, 0x33, 0x87, 0xeb, 0x04, 0xdb, 0xa7, 0x46, 0x47,
- 0xb5, 0xf1, 0x4e, 0xf2, 0x9b, 0x57, 0x1b, 0x82, 0x5c, 0xb8, 0xf4, 0xf5, 0xa0, 0x9f, 0x43, 0x59,
- 0x35, 0x0c, 0xc5, 0xb2, 0x55, 0x1b, 0x2b, 0xe7, 0x57, 0x36, 0xb6, 0xa8, 0x3f, 0x2f, 0xc8, 0x45,
- 0xd5, 0x30, 0x4e, 0x08, 0x75, 0x87, 0x10, 0xd1, 0x5b, 0x50, 0x22, 0xae, 0x5f, 0x53, 0xfb, 0x4a,
- 0x0f, 0x6b, 0xdd, 0x9e, 0x5d, 0x49, 0x6f, 0x0a, 0xf7, 0x13, 0x72, 0x91, 0x53, 0x9b, 0x94, 0x88,
- 0xb6, 0x60, 0xd5, 0x61, 0x6b, 0xeb, 0x26, 0x76, 0x78, 0x89, 0xa3, 0x2f, 0xca, 0x2b, 0xbc, 0xab,
- 0xae, 0x9b, 0x98, 0xf1, 0x4b, 0x1d, 0xd7, 0x52, 0x68, 0x98, 0x40, 0x08, 0x92, 0x1d, 0xd5, 0x56,
- 0xe9, 0x0e, 0x14, 0x64, 0xfa, 0x9b, 0xd0, 0x0c, 0xd5, 0xee, 0xf1, 0x75, 0xa5, 0xbf, 0xd1, 0x75,
- 0x48, 0x73, 0xd5, 0x09, 0x3a, 0x0c, 0xde, 0x42, 0x6b, 0x90, 0x32, 0x4c, 0xfd, 0x12, 0xd3, 0x65,
- 0xc9, 0xca, 0xac, 0x21, 0xc9, 0x50, 0x0a, 0x86, 0x14, 0x54, 0x82, 0xb8, 0x3d, 0xe6, 0x5f, 0x89,
- 0xdb, 0x63, 0xf4, 0x2e, 0x24, 0xc9, 0x06, 0xd0, 0x6f, 0x94, 0xa6, 0x04, 0x51, 0x2e, 0xd7, 0xba,
- 0x32, 0xb0, 0x4c, 0x39, 0xa5, 0xeb, 0xb0, 0x36, 0x2d, 0xc4, 0x48, 0x3d, 0x97, 0x1e, 0x08, 0x15,
- 0xe8, 0x3d, 0xc8, 0xba, 0x3e, 0x95, 0xd9, 0xd7, 0xcd, 0x89, 0xaf, 0x38, 0xcc, 0xb2, 0xcb, 0x4a,
- 0x0c, 0x8b, 0xec, 0x4f, 0x4f, 0xe5, 0x79, 0x41, 0x41, 0xce, 0xa8, 0x86, 0xd1, 0x54, 0xad, 0x9e,
- 0xd4, 0x85, 0x4a, 0x54, 0xfc, 0xf0, 0xad, 0x8f, 0x40, 0x4f, 0x87, 0xb3, 0x3e, 0xbe, 0x93, 0x17,
- 0xa7, 0x7b, 0xe2, 0x9e, 0x3c, 0x6a, 0xc1, 0xa3, 0xe1, 0x0b, 0x62, 0xc1, 0x09, 0xf6, 0x21, 0xda,
- 0xde, 0xeb, 0x48, 0x1d, 0xb8, 0x19, 0x19, 0x4a, 0x02, 0x72, 0x42, 0x40, 0x8e, 0x6c, 0x06, 0x0b,
- 0x50, 0x6c, 0xe0, 0xac, 0x41, 0x86, 0x66, 0xd1, 0x79, 0xd3, 0xcf, 0xe4, 0x64, 0xde, 0x92, 0x7e,
- 0x0f, 0x37, 0x22, 0x62, 0x0a, 0xfa, 0x1d, 0xe4, 0xfb, 0x64, 0xf8, 0xdc, 0xcd, 0x4d, 0x49, 0xaa,
- 0xd8, 0xe9, 0x39, 0x20, 0x4c, 0xd4, 0x99, 0xc9, 0xd0, 0x77, 0x7f, 0x4b, 0x3f, 0x24, 0xe1, 0xfa,
- 0xf4, 0xb0, 0x82, 0x36, 0xa1, 0x30, 0x50, 0xc7, 0x8a, 0x3d, 0xe6, 0xb6, 0x2f, 0x50, 0x6b, 0x82,
- 0x81, 0x3a, 0x6e, 0x8d, 0x99, 0xe1, 0x8b, 0x90, 0xb0, 0xc7, 0x56, 0x25, 0xbe, 0x99, 0xb8, 0x5f,
- 0x90, 0xc9, 0x4f, 0xf4, 0x0c, 0x56, 0xfa, 0x7a, 0x5b, 0xed, 0x2b, 0x7d, 0xd5, 0xb2, 0x95, 0xb6,
- 0x3e, 0x18, 0x68, 0x36, 0x3f, 0xd1, 0xb7, 0x26, 0x0d, 0x87, 0x76, 0x13, 0xaf, 0x47, 0x8f, 0x5f,
- 0x4c, 0x2e, 0x53, 0xd9, 0x03, 0xd5, 0xb2, 0x59, 0x17, 0xda, 0x85, 0xfc, 0x40, 0xb3, 0xce, 0x71,
- 0x4f, 0xbd, 0xd4, 0x74, 0xb3, 0x92, 0xdc, 0x4c, 0x4c, 0x4d, 0xe3, 0x9e, 0x79, 0x3c, 0x5c, 0x93,
- 0x5f, 0xcc, 0xb7, 0xe1, 0xa9, 0xc0, 0x81, 0x70, 0x5c, 0x5a, 0x7a, 0x69, 0x97, 0xf6, 0x2e, 0xac,
- 0x0d, 0xf1, 0xd8, 0x56, 0x5c, 0x77, 0x61, 0x31, 0x2b, 0xcc, 0xd0, 0xcd, 0x44, 0xa4, 0xcf, 0xf5,
- 0x31, 0x16, 0x31, 0x48, 0xb2, 0xdf, 0xa6, 0x3e, 0x1a, 0x76, 0x2a, 0xd9, 0x4d, 0xe1, 0x7e, 0x4a,
- 0x66, 0x0d, 0xf4, 0x18, 0x2a, 0xd4, 0x15, 0x30, 0xff, 0x48, 0x36, 0x04, 0x77, 0x1c, 0xbf, 0x90,
- 0xa3, 0x36, 0x78, 0x8d, 0xf4, 0x53, 0x0f, 0x7c, 0x40, 0x7b, 0xb9, 0x2f, 0xd9, 0x86, 0x35, 0x16,
- 0xd7, 0xb1, 0x49, 0x02, 0x3c, 0xd9, 0x24, 0x3a, 0x00, 0xa0, 0x03, 0x58, 0x71, 0xfa, 0x8e, 0x4d,
- 0xbd, 0x35, 0xa6, 0xdf, 0x7f, 0xd7, 0x15, 0xe8, 0x28, 0xe4, 0xd0, 0x38, 0x96, 0x9e, 0xa7, 0x47,
- 0x00, 0x39, 0x7d, 0x35, 0xc3, 0x0d, 0x14, 0x8f, 0xbd, 0xe3, 0x50, 0x98, 0xcc, 0x62, 0x79, 0x97,
- 0xe7, 0x94, 0xbd, 0xd3, 0xb2, 0x01, 0xf9, 0xcf, 0x47, 0xba, 0x39, 0x1a, 0xb0, 0x21, 0x15, 0xe9,
- 0x90, 0x80, 0x91, 0xe8, 0xe1, 0xfc, 0xe7, 0x94, 0xcf, 0xe6, 0x82, 0x19, 0x06, 0xb7, 0x28, 0xc1,
- 0xb3, 0xa8, 0x13, 0xdf, 0xc0, 0xfd, 0x46, 0x15, 0x5f, 0xd4, 0xa8, 0xdc, 0xb9, 0x45, 0xdb, 0x55,
- 0xe2, 0xc7, 0xd9, 0x15, 0x82, 0x24, 0x9d, 0x61, 0x92, 0x39, 0x64, 0xf2, 0x3b, 0xd2, 0xd6, 0xdc,
- 0xfd, 0x4f, 0xfb, 0xf7, 0xdf, 0xb1, 0xc0, 0xcc, 0x4f, 0x66, 0x81, 0xd9, 0x48, 0x0b, 0xfc, 0xd1,
- 0xb6, 0xd6, 0x82, 0xeb, 0x21, 0x41, 0x65, 0x44, 0x83, 0x26, 0xb5, 0xb6, 0xd0, 0x1d, 0xc5, 0x09,
- 0xd5, 0x3e, 0x45, 0xf2, 0x6a, 0x40, 0x2f, 0x0b, 0xb8, 0x91, 0x16, 0x9c, 0x5f, 0xd6, 0x82, 0x0b,
- 0x8b, 0x58, 0x70, 0xf1, 0x4d, 0x2c, 0xb8, 0x34, 0x61, 0xc1, 0xa7, 0xb0, 0x32, 0x91, 0xe4, 0xba,
- 0xe6, 0x20, 0x4c, 0x35, 0x87, 0xf8, 0x74, 0x73, 0x48, 0xf8, 0xcc, 0x41, 0xfa, 0x4e, 0x80, 0x6a,
- 0x74, 0xae, 0x3b, 0xf5, 0x03, 0xbf, 0x82, 0x6b, 0x5e, 0xce, 0xe3, 0x5f, 0x47, 0x16, 0x57, 0x90,
- 0xdb, 0xe9, 0x2d, 0xe4, 0x8c, 0xfc, 0x80, 0x8d, 0x29, 0xe9, 0x37, 0xd1, 0x67, 0x50, 0x0e, 0x66,
- 0xe9, 0x24, 0x09, 0x22, 0xc7, 0xe5, 0x8f, 0x26, 0x8e, 0x8b, 0xb7, 0x16, 0xee, 0x98, 0xe5, 0xd2,
- 0xa5, 0xbf, 0x69, 0x49, 0xff, 0x1e, 0x77, 0x73, 0x80, 0x40, 0xca, 0x8d, 0x3e, 0x80, 0x34, 0x3f,
- 0xd9, 0xc2, 0xa2, 0x27, 0x9b, 0x0b, 0x84, 0x4f, 0x73, 0xfc, 0xcd, 0x4e, 0x73, 0x62, 0xea, 0xf6,
- 0x25, 0xa7, 0x2f, 0x55, 0xca, 0xbf, 0x54, 0xef, 0x40, 0x8a, 0x05, 0x61, 0x16, 0x50, 0x6e, 0x4c,
- 0x9e, 0x0b, 0x16, 0x7f, 0x19, 0x17, 0xaa, 0x41, 0x96, 0xe5, 0xf3, 0x5a, 0x87, 0x3b, 0x80, 0x9b,
- 0x11, 0x12, 0x7b, 0xbb, 0x3b, 0xf9, 0xd7, 0xaf, 0x36, 0x32, 0xbc, 0x21, 0x67, 0xa8, 0xdc, 0x5e,
- 0x47, 0xfa, 0x5b, 0x80, 0xac, 0x8c, 0x2d, 0x83, 0x98, 0x30, 0xda, 0x81, 0x1c, 0x1e, 0xb7, 0xb1,
- 0x61, 0x3b, 0x77, 0x87, 0xe9, 0x77, 0x33, 0xc6, 0xdd, 0x70, 0x38, 0x9b, 0x31, 0xd9, 0x13, 0x43,
- 0x8f, 0x38, 0x36, 0x13, 0x0d, 0xb3, 0x70, 0x71, 0x3f, 0x38, 0xf3, 0x6b, 0x07, 0x9c, 0x61, 0x81,
- 0x7e, 0x3d, 0x52, 0x2a, 0x84, 0xce, 0x3c, 0xe2, 0xe8, 0x4c, 0x72, 0xce, 0xc7, 0x02, 0xf0, 0x4c,
- 0x3d, 0x00, 0xcf, 0xa4, 0xe6, 0x4c, 0x33, 0x02, 0x9f, 0xf9, 0xb5, 0x83, 0xcf, 0xa4, 0xe7, 0x8c,
- 0x38, 0x04, 0xd0, 0xfc, 0x6e, 0x02, 0xa0, 0xd9, 0x8c, 0x14, 0x9d, 0x82, 0xd0, 0x1c, 0x4d, 0x20,
- 0x34, 0x59, 0xaa, 0xe4, 0xe7, 0x91, 0x4a, 0xe6, 0x40, 0x34, 0x47, 0x13, 0x10, 0x4d, 0x6e, 0x8e,
- 0xc2, 0x39, 0x18, 0xcd, 0x5f, 0x4c, 0xc7, 0x68, 0x20, 0x12, 0x45, 0xe1, 0xc3, 0x5c, 0x0c, 0xa4,
- 0x51, 0x22, 0x40, 0x9a, 0x7c, 0xe4, 0xbd, 0x9f, 0xa9, 0x5f, 0x18, 0xa5, 0xf9, 0xfd, 0x34, 0x94,
- 0x66, 0x25, 0x12, 0x60, 0xe2, 0x56, 0xb9, 0x08, 0x4c, 0x73, 0x3a, 0x05, 0xa6, 0x29, 0x44, 0xc2,
- 0x3f, 0x4c, 0xf1, 0x02, 0x38, 0xcd, 0xe9, 0x14, 0x9c, 0xa6, 0x38, 0x57, 0xed, 0x5c, 0xa0, 0xe6,
- 0x49, 0x10, 0xa8, 0x29, 0x45, 0xdc, 0x83, 0x3d, 0x67, 0x10, 0x81, 0xd4, 0x9c, 0x47, 0x21, 0x35,
- 0x0c, 0xa1, 0x7a, 0x3b, 0x52, 0xe3, 0x12, 0x50, 0xcd, 0xd1, 0x04, 0x54, 0x23, 0xce, 0xb1, 0xe1,
- 0x05, 0xb1, 0x1a, 0xe9, 0x17, 0x24, 0x4a, 0x87, 0xdc, 0x1d, 0x71, 0xdd, 0xd8, 0x34, 0x75, 0x93,
- 0xa3, 0x2b, 0xac, 0x21, 0xdd, 0x27, 0x77, 0x6d, 0xcf, 0xb5, 0xcd, 0xc0, 0x6f, 0xca, 0x50, 0x0c,
- 0xb8, 0x33, 0xe9, 0x1f, 0x05, 0x4f, 0x96, 0x22, 0x38, 0xfe, 0x7b, 0x7a, 0x8e, 0xdf, 0xd3, 0x43,
- 0x77, 0xcb, 0x5c, 0x20, 0xd7, 0xf0, 0x67, 0x33, 0x1c, 0xb0, 0x51, 0xbd, 0x2c, 0xe6, 0x01, 0xac,
- 0xd0, 0xbc, 0x97, 0xc5, 0x8a, 0x40, 0x38, 0x2a, 0x93, 0x0e, 0xb6, 0x0a, 0x2c, 0x2e, 0xbd, 0x03,
- 0xab, 0x3e, 0x5e, 0xf7, 0x72, 0xcc, 0x50, 0x0b, 0xd1, 0xe5, 0xae, 0xf1, 0x5b, 0xf2, 0xbf, 0x26,
- 0xbc, 0x15, 0xf2, 0x90, 0x9e, 0x69, 0xa0, 0x8c, 0xf0, 0xa3, 0x41, 0x99, 0xe8, 0x4b, 0x3a, 0xfa,
- 0x18, 0xd6, 0x02, 0x78, 0x8d, 0x93, 0x56, 0x26, 0x96, 0x83, 0x6d, 0x62, 0xbe, 0x2c, 0xc7, 0xed,
- 0x41, 0x9f, 0xc0, 0x2d, 0x9a, 0x20, 0x47, 0xa4, 0xae, 0xc9, 0xc5, 0x52, 0xd7, 0x1b, 0x44, 0x47,
- 0x7d, 0x4a, 0xfa, 0x1a, 0x01, 0xe6, 0xa4, 0x22, 0xc0, 0x1c, 0x74, 0x00, 0x85, 0x2e, 0x1e, 0x62,
- 0x4b, 0xb3, 0x94, 0x25, 0xee, 0x9c, 0x02, 0xc9, 0xf8, 0x9b, 0x31, 0x39, 0xcf, 0x65, 0x49, 0xef,
- 0xdf, 0x08, 0xc2, 0x4e, 0x19, 0x8a, 0x8a, 0x5f, 0x9d, 0xf4, 0x3f, 0x82, 0x67, 0x96, 0x2e, 0x5a,
- 0xd4, 0xd6, 0x3b, 0xcc, 0x7c, 0x8b, 0x32, 0xfd, 0x4d, 0x6e, 0x57, 0x7d, 0xbd, 0xcb, 0x2d, 0x90,
- 0xfc, 0x24, 0x5c, 0x6e, 0x81, 0x24, 0xc7, 0x23, 0xec, 0x1a, 0xa4, 0xb4, 0x61, 0x07, 0x8f, 0xb9,
- 0x91, 0xb1, 0x06, 0x91, 0x7d, 0x81, 0xaf, 0xb8, 0x29, 0x91, 0x9f, 0x84, 0x8f, 0x9e, 0x33, 0x3a,
- 0x97, 0x82, 0xcc, 0x1a, 0xe8, 0x7d, 0xc8, 0xd1, 0x2a, 0x97, 0xa2, 0x1b, 0x16, 0x8f, 0x91, 0x81,
- 0x54, 0x8e, 0x55, 0xa4, 0xb6, 0x8e, 0x09, 0xcf, 0x91, 0x61, 0xc9, 0x59, 0x83, 0xff, 0xf2, 0x25,
- 0x5b, 0xd9, 0x40, 0xb2, 0x75, 0x1b, 0x72, 0x64, 0xf4, 0x96, 0xa1, 0xb6, 0x31, 0x8d, 0x6f, 0x39,
- 0xd9, 0x23, 0x48, 0xff, 0x24, 0x40, 0x39, 0x14, 0x72, 0xa7, 0xce, 0xdd, 0x39, 0x95, 0xf1, 0x20,
- 0x7a, 0x36, 0x31, 0xfb, 0x3b, 0x00, 0x5d, 0xd5, 0x52, 0x5e, 0xaa, 0x43, 0x1b, 0x77, 0xf8, 0x12,
- 0xe4, 0xba, 0xaa, 0xf5, 0x9c, 0x12, 0x82, 0x83, 0x49, 0x85, 0x06, 0xe3, 0xc3, 0x6f, 0xd2, 0x7e,
- 0xfc, 0x06, 0x55, 0x21, 0x6b, 0x98, 0x9a, 0x6e, 0x6a, 0xf6, 0x15, 0x5d, 0x93, 0x84, 0xec, 0xb6,
- 0xa5, 0x63, 0xb8, 0x36, 0x35, 0xda, 0xa3, 0xc7, 0x90, 0xf3, 0x12, 0x05, 0x81, 0x26, 0xb5, 0x33,
- 0x60, 0x31, 0x8f, 0x97, 0x2c, 0xc9, 0xb5, 0xa9, 0xf1, 0x1e, 0x35, 0x20, 0x6d, 0x62, 0x6b, 0xd4,
- 0x67, 0x49, 0x76, 0xe9, 0xe1, 0x3b, 0x8b, 0xe5, 0x09, 0x84, 0x3a, 0xea, 0xdb, 0x32, 0x17, 0x96,
- 0x3e, 0x85, 0x34, 0xa3, 0xa0, 0x3c, 0x64, 0x4e, 0x0f, 0x9f, 0x1e, 0x1e, 0x3d, 0x3f, 0x14, 0x63,
- 0x08, 0x20, 0x5d, 0xab, 0xd7, 0x1b, 0xc7, 0x2d, 0x51, 0x40, 0x39, 0x48, 0xd5, 0x76, 0x8e, 0xe4,
- 0x96, 0x18, 0x27, 0x64, 0xb9, 0xb1, 0xdf, 0xa8, 0xb7, 0xc4, 0x04, 0x5a, 0x81, 0x22, 0xfb, 0xad,
- 0x3c, 0x39, 0x92, 0x9f, 0xd5, 0x5a, 0x62, 0xd2, 0x47, 0x3a, 0x69, 0x1c, 0xee, 0x36, 0x64, 0x31,
- 0x25, 0xfd, 0x0a, 0x6e, 0x46, 0x66, 0x16, 0x1e, 0x72, 0x26, 0xf8, 0x90, 0x33, 0xe9, 0xdb, 0x38,
- 0xb9, 0x3a, 0x45, 0xa5, 0x0b, 0x68, 0x3f, 0x34, 0xf1, 0x87, 0x4b, 0xe4, 0x1a, 0xa1, 0xd9, 0xa3,
- 0xb7, 0xa0, 0x64, 0xe2, 0x0b, 0x6c, 0xb7, 0x7b, 0x2c, 0x7d, 0x71, 0x00, 0xb0, 0x22, 0xa7, 0x52,
- 0x21, 0x8b, 0xb1, 0x7d, 0x86, 0xdb, 0xb6, 0xc2, 0x8c, 0xc0, 0xa2, 0x30, 0x43, 0x8e, 0xb0, 0x11,
- 0xea, 0x09, 0x23, 0x12, 0xff, 0xcf, 0xfc, 0x14, 0x53, 0x95, 0xa4, 0xaa, 0x80, 0xba, 0x1d, 0x4a,
- 0x91, 0x5e, 0x2e, 0xb5, 0xd8, 0x39, 0x48, 0xc9, 0x8d, 0x96, 0xfc, 0x91, 0x98, 0x40, 0x08, 0x4a,
- 0xf4, 0xa7, 0x72, 0x72, 0x58, 0x3b, 0x3e, 0x69, 0x1e, 0x91, 0xc5, 0x5e, 0x85, 0xb2, 0xb3, 0xd8,
- 0x0e, 0x31, 0x85, 0xae, 0xc1, 0x4a, 0xfd, 0xe8, 0xd9, 0xf1, 0x41, 0xa3, 0xd5, 0xf0, 0xc8, 0x69,
- 0xa9, 0x0a, 0x95, 0xa8, 0x14, 0x49, 0xfa, 0xcf, 0x04, 0xdc, 0x88, 0x48, 0x73, 0xd0, 0xfb, 0x00,
- 0xf6, 0x58, 0x31, 0x71, 0x5b, 0x37, 0x3b, 0xd1, 0x86, 0xdb, 0x1a, 0xcb, 0x94, 0x43, 0xce, 0xd9,
- 0xfc, 0xd7, 0xcc, 0x58, 0xf1, 0x5b, 0xae, 0x94, 0x2c, 0x84, 0xc5, 0x01, 0x9b, 0x3b, 0x53, 0x6e,
- 0xa0, 0xb8, 0x4d, 0x14, 0xd3, 0xfd, 0xa2, 0x8a, 0x29, 0x3f, 0xfa, 0x08, 0x6e, 0x84, 0x42, 0x1a,
- 0x8f, 0x03, 0xd6, 0xb4, 0x02, 0xef, 0xf4, 0xc8, 0x76, 0x2d, 0x18, 0xd9, 0x58, 0x1c, 0xb0, 0x66,
- 0xa0, 0x23, 0xa9, 0x37, 0x40, 0x47, 0xa2, 0x42, 0x63, 0x7a, 0xd9, 0x8a, 0xc6, 0xb4, 0xd0, 0x18,
- 0x4a, 0x39, 0x32, 0xe1, 0x94, 0x43, 0xfa, 0xdf, 0xc0, 0xee, 0x06, 0x53, 0xcb, 0x23, 0x48, 0x5b,
+ // 3811 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4d, 0x6c, 0x1b, 0xd7,
+ 0x76, 0xe6, 0xf0, 0x9f, 0x87, 0x7f, 0xa3, 0x2b, 0xd9, 0xa6, 0x69, 0x5b, 0xd2, 0x1b, 0x37, 0xcf,
+ 0x7e, 0x7e, 0x89, 0x94, 0x67, 0x37, 0xcf, 0x49, 0x5f, 0x5a, 0x80, 0xa2, 0xe8, 0x52, 0xb2, 0x2c,
+ 0x29, 0x23, 0x4a, 0x6e, 0x9a, 0x26, 0x83, 0x11, 0x79, 0x45, 0x4e, 0x4c, 0x72, 0x26, 0x33, 0x43,
+ 0x99, 0xca, 0xb6, 0x2d, 0x50, 0x64, 0x95, 0x7d, 0x91, 0x45, 0x81, 0x76, 0xd9, 0x7d, 0x57, 0xed,
+ 0xae, 0x4d, 0xd1, 0x4d, 0x96, 0x05, 0x0a, 0xb8, 0x81, 0xb3, 0xeb, 0x2e, 0xab, 0x6e, 0xba, 0x28,
+ 0xee, 0xcf, 0xfc, 0x92, 0xc3, 0x9f, 0x38, 0x40, 0xd1, 0x1d, 0xef, 0xb9, 0xe7, 0x9c, 0xb9, 0x3f,
+ 0xe7, 0x9e, 0x73, 0xee, 0x77, 0x2e, 0xe1, 0x96, 0x8d, 0x87, 0x1d, 0x6c, 0x0e, 0xb4, 0xa1, 0xbd,
+ 0xad, 0x9e, 0xb7, 0xb5, 0x6d, 0xfb, 0xca, 0xc0, 0xd6, 0x96, 0x61, 0xea, 0xb6, 0x8e, 0xca, 0x5e,
+ 0xe7, 0x16, 0xe9, 0xac, 0xde, 0xf1, 0x71, 0xb7, 0xcd, 0x2b, 0xc3, 0xd6, 0xb7, 0x0d, 0x53, 0xd7,
+ 0x2f, 0x18, 0x7f, 0xd5, 0xaf, 0x8c, 0xea, 0xd9, 0xee, 0xa8, 0x56, 0x8f, 0x77, 0xde, 0x9e, 0xe8,
+ 0x3c, 0xef, 0xeb, 0xed, 0x17, 0x91, 0xbd, 0xbe, 0x81, 0x04, 0x7a, 0xf9, 0x77, 0x5f, 0xe0, 0x2b,
+ 0xa7, 0xf7, 0xce, 0x84, 0xac, 0xa1, 0x9a, 0xea, 0xc0, 0xe9, 0x5e, 0xf7, 0x75, 0x5f, 0x62, 0xd3,
+ 0xd2, 0xf4, 0x61, 0x40, 0xf9, 0x46, 0x57, 0xd7, 0xbb, 0x7d, 0xbc, 0x4d, 0x5b, 0xe7, 0xa3, 0x8b,
+ 0x6d, 0x5b, 0x1b, 0x60, 0xcb, 0x56, 0x07, 0x06, 0x67, 0x58, 0xeb, 0xea, 0x5d, 0x9d, 0xfe, 0xdc,
+ 0x26, 0xbf, 0x18, 0x55, 0x7a, 0x95, 0x83, 0x8c, 0x8c, 0xbf, 0x18, 0x61, 0xcb, 0x46, 0x0f, 0x21,
+ 0x89, 0xdb, 0x3d, 0xbd, 0x22, 0x6c, 0x0a, 0xf7, 0xf3, 0x0f, 0x6f, 0x6f, 0x85, 0xd6, 0x6d, 0x8b,
+ 0xf3, 0x35, 0xda, 0x3d, 0xbd, 0x19, 0x93, 0x29, 0x2f, 0x7a, 0x0f, 0x52, 0x17, 0xfd, 0x91, 0xd5,
+ 0xab, 0xc4, 0xa9, 0xd0, 0x9d, 0x28, 0xa1, 0x27, 0x84, 0xa9, 0x19, 0x93, 0x19, 0x37, 0xf9, 0x94,
+ 0x36, 0xbc, 0xd0, 0x2b, 0x89, 0xd9, 0x9f, 0xda, 0x1b, 0x5e, 0xd0, 0x4f, 0x11, 0x5e, 0xb4, 0x03,
+ 0xa0, 0x0d, 0x35, 0x5b, 0x69, 0xf7, 0x54, 0x6d, 0x58, 0x49, 0x52, 0xc9, 0x5f, 0x44, 0x4b, 0x6a,
+ 0x76, 0x9d, 0x30, 0x36, 0x63, 0x72, 0x4e, 0x73, 0x1a, 0x64, 0xb8, 0x5f, 0x8c, 0xb0, 0x79, 0x55,
+ 0x49, 0xcd, 0x1e, 0xee, 0x47, 0x84, 0x89, 0x0c, 0x97, 0x72, 0xa3, 0x0f, 0x21, 0xdb, 0xee, 0xe1,
+ 0xf6, 0x0b, 0xc5, 0x1e, 0x57, 0x32, 0x54, 0x72, 0x23, 0x4a, 0xb2, 0x4e, 0xf8, 0x5a, 0xe3, 0x66,
+ 0x4c, 0xce, 0xb4, 0xd9, 0x4f, 0x74, 0x08, 0xa5, 0xbe, 0x66, 0xd9, 0x8a, 0x35, 0x54, 0x0d, 0xab,
+ 0xa7, 0xdb, 0x56, 0x25, 0x4f, 0x75, 0xbc, 0x15, 0xa5, 0xe3, 0x40, 0xb3, 0xec, 0x13, 0x87, 0xb9,
+ 0x19, 0x93, 0x8b, 0x7d, 0x3f, 0x81, 0xe8, 0xd3, 0x2f, 0x2e, 0xb0, 0xe9, 0x2a, 0xac, 0x14, 0x66,
+ 0xeb, 0x3b, 0x22, 0xdc, 0x8e, 0x3c, 0xd1, 0xa7, 0xfb, 0x09, 0xe8, 0x13, 0x58, 0xed, 0xeb, 0x6a,
+ 0xc7, 0x55, 0xa7, 0xb4, 0x7b, 0xa3, 0xe1, 0x8b, 0x4a, 0x91, 0x2a, 0xfd, 0x55, 0xe4, 0x20, 0x75,
+ 0xb5, 0xe3, 0xa8, 0xa8, 0x13, 0x81, 0x66, 0x4c, 0x5e, 0xe9, 0x87, 0x89, 0xe8, 0x33, 0x58, 0x53,
+ 0x0d, 0xa3, 0x7f, 0x15, 0xd6, 0x5e, 0xa2, 0xda, 0x1f, 0x44, 0x69, 0xaf, 0x11, 0x99, 0xb0, 0x7a,
+ 0xa4, 0x4e, 0x50, 0xd1, 0x73, 0x58, 0xb9, 0xd0, 0x86, 0x6a, 0x5f, 0xfb, 0x12, 0x7b, 0xeb, 0xb1,
+ 0x46, 0x95, 0xdf, 0x8f, 0x34, 0x46, 0x2e, 0xe0, 0x5b, 0x12, 0xf1, 0x22, 0x44, 0x43, 0x2d, 0x10,
+ 0x0d, 0x13, 0x1b, 0xaa, 0x89, 0x15, 0xc3, 0xd4, 0x0d, 0xdd, 0x52, 0xfb, 0x95, 0x32, 0xd5, 0x7b,
+ 0x2f, 0x4a, 0xef, 0x31, 0xe3, 0x3f, 0xe6, 0xec, 0xcd, 0x98, 0x5c, 0x36, 0x82, 0x24, 0xa6, 0x55,
+ 0x6f, 0x63, 0xcb, 0xf2, 0xb4, 0x8a, 0xf3, 0xb4, 0x52, 0xfe, 0xa0, 0xd6, 0x00, 0x09, 0x35, 0x20,
+ 0x8f, 0xc7, 0x44, 0x5c, 0xb9, 0xd4, 0x6d, 0x5c, 0x59, 0xa1, 0x0a, 0xa5, 0xc8, 0x03, 0x4c, 0x59,
+ 0xcf, 0x74, 0x1b, 0x37, 0x63, 0x32, 0x60, 0xb7, 0x85, 0x54, 0xb8, 0x76, 0x89, 0x4d, 0xed, 0xe2,
+ 0x8a, 0xaa, 0x51, 0x68, 0x0f, 0x71, 0x34, 0x15, 0x44, 0x15, 0xfe, 0x3a, 0x4a, 0xe1, 0x19, 0x15,
+ 0x22, 0x2a, 0x1a, 0x8e, 0x48, 0x33, 0x26, 0xaf, 0x5e, 0x4e, 0x92, 0x89, 0xed, 0xba, 0xdb, 0x45,
+ 0x3d, 0x67, 0x65, 0x75, 0xb6, 0xed, 0x3a, 0x7b, 0xb5, 0x43, 0x98, 0x89, 0xed, 0x5e, 0xf8, 0x09,
+ 0x3b, 0x19, 0x48, 0x5d, 0xaa, 0xfd, 0x11, 0xde, 0x4f, 0x66, 0xd3, 0x62, 0x66, 0x3f, 0x99, 0xcd,
+ 0x8a, 0xb9, 0xfd, 0x64, 0x36, 0x27, 0xc2, 0x7e, 0x32, 0x0b, 0x62, 0x5e, 0xba, 0x07, 0x79, 0x9f,
+ 0xdf, 0x42, 0x15, 0xc8, 0x0c, 0xb0, 0x65, 0xa9, 0x5d, 0x4c, 0xdd, 0x5c, 0x4e, 0x76, 0x9a, 0x52,
+ 0x09, 0x0a, 0x7e, 0x5f, 0x25, 0x7d, 0x2d, 0xb8, 0x92, 0xc4, 0x0d, 0x11, 0x49, 0xee, 0x77, 0x1d,
+ 0x49, 0xde, 0x44, 0x77, 0xa1, 0x48, 0xa7, 0xa2, 0x38, 0xfd, 0xc4, 0x17, 0x26, 0xe5, 0x02, 0x25,
+ 0x9e, 0x71, 0xa6, 0x0d, 0xc8, 0x1b, 0x0f, 0x0d, 0x97, 0x25, 0x41, 0x59, 0xc0, 0x78, 0x68, 0x38,
+ 0x0c, 0xbf, 0x80, 0x02, 0x99, 0xb7, 0xcb, 0x91, 0xa4, 0x1f, 0xc9, 0x13, 0x1a, 0x67, 0x91, 0xfe,
+ 0x22, 0x01, 0x62, 0xd8, 0xbf, 0xa1, 0xf7, 0x21, 0x49, 0x5c, 0x3d, 0xf7, 0xda, 0xd5, 0x2d, 0x16,
+ 0x07, 0xb6, 0x9c, 0x38, 0xb0, 0xd5, 0x72, 0xe2, 0xc0, 0x4e, 0xf6, 0xdb, 0x57, 0x1b, 0xb1, 0xaf,
+ 0xff, 0x73, 0x43, 0x90, 0xa9, 0x04, 0xba, 0x49, 0xbc, 0x9a, 0xaa, 0x0d, 0x15, 0xad, 0x43, 0x87,
+ 0x9c, 0x23, 0x2e, 0x4b, 0xd5, 0x86, 0x7b, 0x1d, 0x74, 0x00, 0x62, 0x5b, 0x1f, 0x5a, 0x78, 0x68,
+ 0x8d, 0x2c, 0x85, 0xc5, 0x21, 0xee, 0xab, 0x03, 0x1e, 0x97, 0x05, 0xa0, 0xba, 0xc3, 0x79, 0x4c,
+ 0x19, 0xe5, 0x72, 0x3b, 0x48, 0x40, 0x87, 0x50, 0xbc, 0x54, 0xfb, 0x5a, 0x47, 0xb5, 0x75, 0x53,
+ 0xb1, 0xb0, 0xcd, 0x9d, 0xf7, 0xdd, 0x89, 0x3d, 0x3f, 0x73, 0xb8, 0x4e, 0xb0, 0x7d, 0x6a, 0x74,
+ 0x54, 0x1b, 0xef, 0x24, 0xbf, 0x7d, 0xb5, 0x21, 0xc8, 0x85, 0x4b, 0x5f, 0x0f, 0xfa, 0x25, 0x94,
+ 0x55, 0xc3, 0x50, 0x2c, 0x5b, 0xb5, 0xb1, 0x72, 0x7e, 0x65, 0x63, 0x8b, 0xfa, 0xf3, 0x82, 0x5c,
+ 0x54, 0x0d, 0xe3, 0x84, 0x50, 0x77, 0x08, 0x11, 0xbd, 0x05, 0x25, 0xe2, 0xfa, 0x35, 0xb5, 0xaf,
+ 0xf4, 0xb0, 0xd6, 0xed, 0xd9, 0x95, 0xf4, 0xa6, 0x70, 0x3f, 0x21, 0x17, 0x39, 0xb5, 0x49, 0x89,
+ 0x68, 0x0b, 0x56, 0x1d, 0xb6, 0xb6, 0x6e, 0x62, 0x87, 0x97, 0x38, 0xfa, 0xa2, 0xbc, 0xc2, 0xbb,
+ 0xea, 0xba, 0x89, 0x19, 0xbf, 0xd4, 0x71, 0x2d, 0x85, 0x86, 0x09, 0x84, 0x20, 0xd9, 0x51, 0x6d,
+ 0x95, 0xee, 0x40, 0x41, 0xa6, 0xbf, 0x09, 0xcd, 0x50, 0xed, 0x1e, 0x5f, 0x57, 0xfa, 0x1b, 0x5d,
+ 0x87, 0x34, 0x57, 0x9d, 0xa0, 0xc3, 0xe0, 0x2d, 0xb4, 0x06, 0x29, 0xc3, 0xd4, 0x2f, 0x31, 0x5d,
+ 0x96, 0xac, 0xcc, 0x1a, 0x92, 0x0c, 0xa5, 0x60, 0x48, 0x41, 0x25, 0x88, 0xdb, 0x63, 0xfe, 0x95,
+ 0xb8, 0x3d, 0x46, 0xef, 0x42, 0x92, 0x6c, 0x00, 0xfd, 0x46, 0x69, 0x4a, 0x10, 0xe5, 0x72, 0xad,
+ 0x2b, 0x03, 0xcb, 0x94, 0x53, 0xba, 0x0e, 0x6b, 0xd3, 0x42, 0x8c, 0xd4, 0x73, 0xe9, 0x81, 0x50,
+ 0x81, 0xde, 0x83, 0xac, 0xeb, 0x53, 0x99, 0x7d, 0xdd, 0x9c, 0xf8, 0x8a, 0xc3, 0x2c, 0xbb, 0xac,
+ 0xc4, 0xb0, 0xc8, 0xfe, 0xf4, 0x54, 0x9e, 0x17, 0x14, 0xe4, 0x8c, 0x6a, 0x18, 0x4d, 0xd5, 0xea,
+ 0x49, 0x5d, 0xa8, 0x44, 0xc5, 0x0f, 0xdf, 0xfa, 0x08, 0xf4, 0x74, 0x38, 0xeb, 0xe3, 0x3b, 0x79,
+ 0x71, 0xba, 0x27, 0xee, 0xc9, 0xa3, 0x16, 0x3c, 0x1a, 0xbe, 0x20, 0x16, 0x9c, 0x60, 0x1f, 0xa2,
+ 0xed, 0xbd, 0x8e, 0xd4, 0x81, 0x9b, 0x91, 0xa1, 0x24, 0x20, 0x27, 0x04, 0xe4, 0xc8, 0x66, 0xb0,
+ 0x00, 0xc5, 0x06, 0xce, 0x1a, 0x64, 0x68, 0x16, 0x9d, 0x37, 0xfd, 0x4c, 0x4e, 0xe6, 0x2d, 0xe9,
+ 0x6f, 0x04, 0xb8, 0x11, 0x11, 0x54, 0x50, 0x1d, 0x4a, 0x6e, 0xcc, 0x63, 0xae, 0x6e, 0x4a, 0x62,
+ 0xc5, 0x4e, 0xd0, 0x01, 0x99, 0x27, 0x75, 0x68, 0x72, 0xd1, 0x91, 0xa1, 0x4d, 0x54, 0x83, 0x62,
+ 0x17, 0x0f, 0xb1, 0xa5, 0x59, 0x5c, 0x47, 0x7c, 0x01, 0x1d, 0x05, 0x2e, 0x42, 0x5b, 0xd2, 0x8f,
+ 0x49, 0xb8, 0x3e, 0x3d, 0x40, 0xa1, 0x4d, 0x28, 0x0c, 0xd4, 0xb1, 0x62, 0x8f, 0xf9, 0x29, 0x12,
+ 0xa8, 0x5d, 0xc2, 0x40, 0x1d, 0xb7, 0xc6, 0xec, 0x08, 0x89, 0x90, 0xb0, 0xc7, 0x56, 0x25, 0xbe,
+ 0x99, 0xb8, 0x5f, 0x90, 0xc9, 0x4f, 0xf4, 0x0c, 0x56, 0xfa, 0x7a, 0x5b, 0xed, 0x2b, 0x7d, 0xd5,
+ 0xb2, 0x95, 0xb6, 0x3e, 0x18, 0x68, 0x36, 0xf7, 0x0d, 0xb7, 0x26, 0x4d, 0x90, 0x76, 0x13, 0xff,
+ 0x49, 0x0f, 0x72, 0x4c, 0x2e, 0x53, 0xd9, 0x03, 0xd5, 0xb2, 0x59, 0x17, 0xda, 0x85, 0xfc, 0x40,
+ 0xb3, 0xce, 0x71, 0x4f, 0xbd, 0xd4, 0x74, 0xb3, 0x92, 0xdc, 0x4c, 0x4c, 0x4d, 0x08, 0x9f, 0x79,
+ 0x3c, 0x5c, 0x93, 0x5f, 0xcc, 0x67, 0x3a, 0xa9, 0xc0, 0xd1, 0x72, 0x9c, 0x63, 0x7a, 0x69, 0xe7,
+ 0xf8, 0x2e, 0xac, 0x0d, 0xf1, 0xd8, 0x56, 0x5c, 0xc7, 0x63, 0x31, 0x7b, 0xce, 0x50, 0xb3, 0x40,
+ 0xa4, 0xcf, 0xf5, 0x56, 0x16, 0x31, 0x6d, 0x62, 0x39, 0xa6, 0x3e, 0x1a, 0x76, 0x2a, 0xd9, 0x4d,
+ 0xe1, 0x7e, 0x4a, 0x66, 0x0d, 0xf4, 0x18, 0x2a, 0xd4, 0xa9, 0x30, 0x4f, 0x4b, 0x36, 0x04, 0x77,
+ 0x1c, 0x0f, 0x93, 0xa3, 0xd6, 0x7c, 0x8d, 0xf4, 0x53, 0x5f, 0x7e, 0x40, 0x7b, 0xb9, 0x57, 0xda,
+ 0x86, 0x35, 0x96, 0x21, 0x60, 0x93, 0xa4, 0x0a, 0x64, 0x93, 0xe8, 0x00, 0x80, 0x0e, 0x60, 0xc5,
+ 0xe9, 0x3b, 0x36, 0xf5, 0xd6, 0x98, 0x7e, 0xff, 0x5d, 0x57, 0xa0, 0xa3, 0x90, 0xe3, 0xe7, 0x9c,
+ 0x99, 0x3c, 0x3d, 0x4c, 0xc8, 0xe9, 0xab, 0x19, 0x6e, 0xc8, 0x79, 0xec, 0x1d, 0xac, 0xc2, 0x64,
+ 0x3e, 0xcc, 0xbb, 0x3c, 0xf7, 0xee, 0x9d, 0xbb, 0x0d, 0xc8, 0x7f, 0x31, 0xd2, 0xcd, 0xd1, 0x80,
+ 0x0d, 0xa9, 0x48, 0x87, 0x04, 0x8c, 0x44, 0x8f, 0xf9, 0x3f, 0xa5, 0x7c, 0x36, 0x17, 0xcc, 0x55,
+ 0xb8, 0x45, 0x09, 0x9e, 0x45, 0x9d, 0xf8, 0x06, 0xee, 0x37, 0xaa, 0xf8, 0xa2, 0x46, 0xe5, 0xce,
+ 0x2d, 0xda, 0xae, 0x12, 0x3f, 0xcd, 0xae, 0x10, 0x24, 0xe9, 0x0c, 0x93, 0xcc, 0xb5, 0x93, 0xdf,
+ 0x91, 0xb6, 0xe6, 0xee, 0x7f, 0xda, 0xbf, 0xff, 0x8e, 0x05, 0x66, 0x7e, 0x36, 0x0b, 0xcc, 0x46,
+ 0x5a, 0xe0, 0x4f, 0xb6, 0xb5, 0x16, 0x5c, 0x0f, 0x09, 0x2a, 0x23, 0x1a, 0x7e, 0xa9, 0xb5, 0x85,
+ 0x6e, 0x3b, 0x4e, 0xd0, 0xf7, 0x29, 0x92, 0x57, 0x03, 0x7a, 0x59, 0xe8, 0x8e, 0xb4, 0xe0, 0xfc,
+ 0xb2, 0x16, 0x5c, 0x58, 0xc4, 0x82, 0x8b, 0x6f, 0x62, 0xc1, 0xa5, 0x09, 0x0b, 0x3e, 0x85, 0x95,
+ 0x89, 0x74, 0xd9, 0x35, 0x07, 0x61, 0xaa, 0x39, 0xc4, 0xa7, 0x9b, 0x43, 0xc2, 0x67, 0x0e, 0xd2,
+ 0xf7, 0x02, 0x54, 0xa3, 0xb3, 0xe6, 0xa9, 0x1f, 0xf8, 0x0d, 0x5c, 0xf3, 0xb2, 0x27, 0xff, 0x3a,
+ 0xb2, 0x08, 0x85, 0xdc, 0x4e, 0x6f, 0x21, 0x67, 0x64, 0x1a, 0x6c, 0x4c, 0x49, 0xbf, 0x89, 0x3e,
+ 0x83, 0x72, 0x30, 0xdf, 0x27, 0xe9, 0x14, 0x39, 0x2e, 0xbf, 0x37, 0x71, 0x5c, 0xbc, 0xb5, 0x70,
+ 0xc7, 0x2c, 0x97, 0x2e, 0xfd, 0x4d, 0x4b, 0xfa, 0xb7, 0xb8, 0x9b, 0x4d, 0x04, 0x92, 0x77, 0xf4,
+ 0x01, 0xa4, 0xf9, 0xc9, 0x16, 0x16, 0x3d, 0xd9, 0x5c, 0x20, 0x7c, 0x9a, 0xe3, 0x6f, 0x76, 0x9a,
+ 0x13, 0x53, 0xb7, 0x2f, 0x39, 0x7d, 0xa9, 0x52, 0xfe, 0xa5, 0x7a, 0x07, 0x52, 0x2c, 0x0c, 0xb3,
+ 0x80, 0x72, 0x63, 0xf2, 0x5c, 0xb0, 0x08, 0xcc, 0xb8, 0x50, 0x0d, 0xb2, 0xec, 0x66, 0xa0, 0x75,
+ 0xb8, 0x03, 0xb8, 0x19, 0x21, 0xb1, 0xb7, 0xbb, 0x93, 0x7f, 0xfd, 0x6a, 0x23, 0xc3, 0x1b, 0x72,
+ 0x86, 0xca, 0xed, 0x75, 0xa4, 0xbf, 0x06, 0xc8, 0xca, 0xd8, 0x32, 0x88, 0x09, 0xa3, 0x1d, 0xc8,
+ 0xe1, 0x71, 0x1b, 0x1b, 0xb6, 0x73, 0x0b, 0x99, 0x7e, 0xcb, 0x63, 0xdc, 0x0d, 0x87, 0xb3, 0x19,
+ 0x93, 0x3d, 0x31, 0xf4, 0x88, 0xa3, 0x3c, 0xd1, 0x80, 0x0d, 0x17, 0xf7, 0xc3, 0x3c, 0xbf, 0x75,
+ 0x60, 0x1e, 0x16, 0xe8, 0xd7, 0x23, 0xa5, 0x42, 0x38, 0xcf, 0x23, 0x8e, 0xf3, 0x24, 0xe7, 0x7c,
+ 0x2c, 0x00, 0xf4, 0xd4, 0x03, 0x40, 0x4f, 0x6a, 0xce, 0x34, 0x23, 0x90, 0x9e, 0xdf, 0x3a, 0x48,
+ 0x4f, 0x7a, 0xce, 0x88, 0x43, 0x50, 0xcf, 0x1f, 0x4e, 0x40, 0x3d, 0x9b, 0x91, 0xa2, 0x53, 0xb0,
+ 0x9e, 0xa3, 0x09, 0xac, 0x27, 0x4b, 0x95, 0xfc, 0x32, 0x52, 0xc9, 0x1c, 0xb0, 0xe7, 0x68, 0x02,
+ 0xec, 0xc9, 0xcd, 0x51, 0x38, 0x07, 0xed, 0xf9, 0xb3, 0xe9, 0x68, 0x0f, 0x44, 0xe2, 0x31, 0x7c,
+ 0x98, 0x8b, 0xc1, 0x3d, 0x4a, 0x04, 0xdc, 0x93, 0x8f, 0x44, 0x10, 0x98, 0xfa, 0x85, 0xf1, 0x9e,
+ 0x3f, 0x99, 0x86, 0xf7, 0xac, 0x44, 0x42, 0x55, 0xdc, 0x2a, 0x17, 0x01, 0x7c, 0x4e, 0xa7, 0x00,
+ 0x3e, 0x85, 0x48, 0x20, 0x89, 0x29, 0x5e, 0x00, 0xf1, 0x39, 0x9d, 0x82, 0xf8, 0x14, 0xe7, 0xaa,
+ 0x9d, 0x0b, 0xf9, 0x3c, 0x09, 0x42, 0x3e, 0xa5, 0x88, 0x1b, 0xb5, 0xe7, 0x0c, 0x22, 0x30, 0x9f,
+ 0xf3, 0x28, 0xcc, 0x87, 0x61, 0x5d, 0x6f, 0x47, 0x6a, 0x5c, 0x02, 0xf4, 0x39, 0x9a, 0x00, 0x7d,
+ 0xc4, 0x39, 0x36, 0xbc, 0x20, 0xea, 0x23, 0xfd, 0x8a, 0x44, 0xe9, 0x90, 0xbb, 0x23, 0xae, 0x1b,
+ 0x9b, 0xa6, 0x6e, 0x72, 0x9c, 0x86, 0x35, 0xa4, 0xfb, 0xe4, 0xd6, 0xee, 0xb9, 0xb6, 0x19, 0x48,
+ 0x50, 0x19, 0x8a, 0x01, 0x77, 0x26, 0xfd, 0x83, 0xe0, 0xc9, 0x52, 0x2c, 0xc8, 0x7f, 0xe3, 0xcf,
+ 0xf1, 0x1b, 0x7f, 0xe8, 0x96, 0x9a, 0x0b, 0xe4, 0x1a, 0xfe, 0x6c, 0x86, 0x43, 0x3f, 0xaa, 0x97,
+ 0xc5, 0x3c, 0x80, 0x15, 0x9a, 0xf7, 0xb2, 0x58, 0x11, 0x08, 0x47, 0x65, 0xd2, 0xc1, 0x56, 0x81,
+ 0xc5, 0xa5, 0x77, 0x60, 0xd5, 0xc7, 0xeb, 0x5e, 0xb3, 0x19, 0xfe, 0x21, 0xba, 0xdc, 0x35, 0x7e,
+ 0xdf, 0xfe, 0x97, 0x84, 0xb7, 0x42, 0x1e, 0x66, 0x34, 0x0d, 0xde, 0x11, 0x7e, 0x32, 0xbc, 0x13,
+ 0x7d, 0xdd, 0x47, 0x9f, 0xc0, 0x5a, 0x00, 0xf9, 0x71, 0xd2, 0xca, 0xc4, 0x72, 0x00, 0x50, 0xcc,
+ 0x97, 0xe5, 0xb8, 0x3d, 0xe8, 0x53, 0xb8, 0x45, 0x13, 0xe4, 0x88, 0xd4, 0x35, 0xb9, 0x58, 0xea,
+ 0x7a, 0x83, 0xe8, 0xa8, 0x4f, 0x49, 0x5f, 0x23, 0x60, 0xa1, 0x54, 0x04, 0x2c, 0x84, 0x0e, 0xc0,
+ 0xb9, 0x77, 0x2b, 0x4b, 0xdc, 0x39, 0x05, 0x92, 0xf1, 0x37, 0x63, 0x72, 0x9e, 0xcb, 0x92, 0xde,
+ 0xbf, 0x12, 0x84, 0x9d, 0x32, 0x14, 0x15, 0xbf, 0x3a, 0xe9, 0xbf, 0x05, 0xcf, 0x2c, 0x5d, 0xdc,
+ 0xa9, 0xad, 0x77, 0x98, 0xf9, 0x16, 0x65, 0xfa, 0x9b, 0xdc, 0xae, 0xfa, 0x7a, 0x97, 0x5b, 0x20,
+ 0xf9, 0x49, 0xb8, 0xdc, 0x52, 0x4b, 0x8e, 0x47, 0xd8, 0x35, 0x48, 0x69, 0xc3, 0x0e, 0x1e, 0x73,
+ 0x23, 0x63, 0x0d, 0x22, 0xfb, 0x02, 0x5f, 0x71, 0x53, 0x22, 0x3f, 0x09, 0x1f, 0x3d, 0x67, 0x74,
+ 0x2e, 0x05, 0x99, 0x35, 0xd0, 0xfb, 0x90, 0xa3, 0xf5, 0x32, 0x45, 0x37, 0x2c, 0x1e, 0x23, 0x03,
+ 0xa9, 0x1c, 0xab, 0x6d, 0x6d, 0x1d, 0x13, 0x9e, 0x23, 0xc3, 0x92, 0xb3, 0x06, 0xff, 0xe5, 0x4b,
+ 0xb6, 0xb2, 0x81, 0x64, 0xeb, 0x36, 0xe4, 0xc8, 0xe8, 0x2d, 0x43, 0x6d, 0x63, 0x1a, 0xdf, 0x72,
+ 0xb2, 0x47, 0x90, 0xfe, 0x51, 0x80, 0x72, 0x28, 0xe4, 0x4e, 0x9d, 0xbb, 0x73, 0x2a, 0xe3, 0x41,
+ 0x1c, 0x6e, 0x62, 0xf6, 0x77, 0x00, 0xba, 0xaa, 0xa5, 0xbc, 0x54, 0x87, 0x36, 0xee, 0xf0, 0x25,
+ 0xc8, 0x75, 0x55, 0xeb, 0x39, 0x25, 0x04, 0x07, 0x93, 0x0a, 0x0d, 0xc6, 0x87, 0x04, 0xa5, 0xfd,
+ 0x48, 0x10, 0xaa, 0x42, 0xd6, 0x30, 0x35, 0xdd, 0xd4, 0xec, 0x2b, 0xba, 0x26, 0x09, 0xd9, 0x6d,
+ 0x4b, 0xc7, 0x70, 0x6d, 0x6a, 0xb4, 0x47, 0x8f, 0x21, 0xe7, 0x25, 0x0a, 0x02, 0x4d, 0x6a, 0x67,
+ 0x00, 0x6c, 0x1e, 0x2f, 0x59, 0x92, 0x6b, 0x53, 0xe3, 0x3d, 0x6a, 0x40, 0xda, 0xc4, 0xd6, 0xa8,
+ 0xcf, 0x92, 0xec, 0xd2, 0xc3, 0x77, 0x16, 0xcb, 0x13, 0x08, 0x75, 0xd4, 0xb7, 0x65, 0x2e, 0x2c,
+ 0x7d, 0x06, 0x69, 0x46, 0x41, 0x79, 0xc8, 0x9c, 0x1e, 0x3e, 0x3d, 0x3c, 0x7a, 0x7e, 0x28, 0xc6,
+ 0x10, 0x40, 0xba, 0x56, 0xaf, 0x37, 0x8e, 0x5b, 0xa2, 0x80, 0x72, 0x90, 0xaa, 0xed, 0x1c, 0xc9,
+ 0x2d, 0x31, 0x4e, 0xc8, 0x72, 0x63, 0xbf, 0x51, 0x6f, 0x89, 0x09, 0xb4, 0x02, 0x45, 0xf6, 0x5b,
+ 0x79, 0x72, 0x24, 0x3f, 0xab, 0xb5, 0xc4, 0xa4, 0x8f, 0x74, 0xd2, 0x38, 0xdc, 0x6d, 0xc8, 0x62,
+ 0x4a, 0xfa, 0x0d, 0xdc, 0x8c, 0xcc, 0x2c, 0x3c, 0x0c, 0x4e, 0xf0, 0x61, 0x70, 0xd2, 0x77, 0x71,
+ 0x72, 0x75, 0x8a, 0x4a, 0x17, 0xd0, 0x7e, 0x68, 0xe2, 0x0f, 0x97, 0xc8, 0x35, 0x42, 0xb3, 0x47,
+ 0x6f, 0x41, 0xc9, 0xc4, 0x17, 0xd8, 0x6e, 0xf7, 0x58, 0xfa, 0xe2, 0x00, 0x60, 0x45, 0x4e, 0xa5,
+ 0x42, 0x16, 0x63, 0xfb, 0x1c, 0xb7, 0x6d, 0x85, 0x19, 0x81, 0x45, 0x61, 0x86, 0x1c, 0x61, 0x23,
+ 0xd4, 0x13, 0x46, 0x24, 0xfe, 0x9f, 0xf9, 0x29, 0xa6, 0x2a, 0x49, 0x55, 0x01, 0x75, 0x3b, 0x94,
+ 0x22, 0xbd, 0x5c, 0x6a, 0xb1, 0x73, 0x90, 0x92, 0x1b, 0x2d, 0xf9, 0x63, 0x31, 0x81, 0x10, 0x94,
+ 0xe8, 0x4f, 0xe5, 0xe4, 0xb0, 0x76, 0x7c, 0xd2, 0x3c, 0x22, 0x8b, 0xbd, 0x0a, 0x65, 0x67, 0xb1,
+ 0x1d, 0x62, 0x0a, 0x5d, 0x83, 0x95, 0xfa, 0xd1, 0xb3, 0xe3, 0x83, 0x46, 0xab, 0xe1, 0x91, 0xd3,
+ 0x52, 0x15, 0x2a, 0x51, 0x29, 0x92, 0xf4, 0x1f, 0x09, 0xb8, 0x11, 0x91, 0xe6, 0xa0, 0xf7, 0x01,
+ 0xec, 0xb1, 0x62, 0xe2, 0xb6, 0x6e, 0x76, 0xa2, 0x0d, 0xb7, 0x35, 0x96, 0x29, 0x87, 0x9c, 0xb3,
+ 0xf9, 0xaf, 0x99, 0xb1, 0xe2, 0x43, 0xae, 0x94, 0x2c, 0x84, 0xc5, 0x01, 0x9b, 0x3b, 0x53, 0x6e,
+ 0xa0, 0xb8, 0x4d, 0x14, 0xd3, 0xfd, 0xa2, 0x8a, 0x29, 0x3f, 0xfa, 0x18, 0x6e, 0x84, 0x42, 0x1a,
+ 0x8f, 0x03, 0xd6, 0xb4, 0x52, 0xf1, 0xf4, 0xc8, 0x76, 0x2d, 0x18, 0xd9, 0x58, 0x1c, 0xb0, 0x66,
+ 0xa0, 0x23, 0xa9, 0x37, 0x40, 0x47, 0xa2, 0x42, 0x63, 0x7a, 0xd9, 0xda, 0xc8, 0xb4, 0xd0, 0x18,
+ 0x4a, 0x39, 0x32, 0xe1, 0x94, 0x43, 0xfa, 0x9f, 0xc0, 0xee, 0x06, 0x53, 0xcb, 0x23, 0x48, 0x5b,
0xb6, 0x6a, 0x8f, 0x2c, 0x7e, 0x92, 0x1e, 0x2f, 0x9a, 0xa7, 0x6e, 0x39, 0x3f, 0x4e, 0xa8, 0xb8,
- 0xcc, 0xd5, 0xfc, 0x41, 0x6e, 0x7a, 0xd4, 0xf6, 0xa4, 0x7e, 0x8a, 0xed, 0x69, 0x42, 0x1a, 0x5f,
- 0xe2, 0xa1, 0x6d, 0x55, 0xd2, 0x74, 0xc6, 0xd7, 0x27, 0x67, 0x4c, 0xba, 0x77, 0x2a, 0x24, 0xf7,
- 0xf9, 0xef, 0x57, 0x1b, 0x22, 0xe3, 0x7e, 0x5b, 0x1f, 0x68, 0x36, 0x1e, 0x18, 0xf6, 0x95, 0xcc,
- 0xe5, 0xa5, 0xf7, 0xa0, 0x14, 0x5c, 0xf4, 0x68, 0x17, 0xe2, 0x39, 0xe9, 0xb8, 0xf4, 0x0f, 0x02,
- 0xac, 0x4e, 0xc1, 0x72, 0xd0, 0x63, 0x5e, 0x08, 0x62, 0x1b, 0x7f, 0x77, 0x72, 0xf5, 0x02, 0xec,
- 0x5e, 0x3d, 0x88, 0x04, 0x4d, 0xef, 0xea, 0xc0, 0xf6, 0xd8, 0x23, 0xa0, 0x5f, 0x42, 0xd9, 0xd2,
- 0xba, 0x43, 0xc5, 0x64, 0xb0, 0x90, 0x5b, 0x64, 0x21, 0x99, 0x3d, 0xe9, 0x70, 0x4a, 0x91, 0x1d,
- 0x92, 0xf9, 0x20, 0x10, 0x95, 0x10, 0xb7, 0xd4, 0x06, 0x34, 0x79, 0x93, 0x99, 0x06, 0x5c, 0x09,
- 0x6f, 0x00, 0x5c, 0xfd, 0xbd, 0x00, 0xb7, 0x66, 0xdc, 0x6e, 0xd0, 0x87, 0xa1, 0x73, 0xf1, 0xc1,
- 0x32, 0x77, 0xa3, 0x2d, 0x46, 0x0b, 0x9e, 0x0c, 0xe9, 0x11, 0x14, 0xfc, 0xf4, 0xc5, 0x36, 0x6f,
- 0xdf, 0x8b, 0xfd, 0x41, 0x80, 0xed, 0x2e, 0x14, 0x4d, 0x6c, 0x13, 0x27, 0x15, 0x40, 0x24, 0x0b,
- 0x8c, 0xc8, 0xd2, 0xd4, 0xfd, 0x64, 0x56, 0x10, 0xe3, 0xae, 0xfd, 0xfc, 0x9b, 0x00, 0xe0, 0xa1,
- 0x6e, 0x1e, 0xea, 0x25, 0xf8, 0x51, 0xaf, 0x10, 0x58, 0x1a, 0x0f, 0x83, 0xa5, 0xe8, 0x1e, 0x94,
- 0xd9, 0x7d, 0x84, 0xec, 0x9b, 0x6a, 0x8f, 0x4c, 0xcc, 0x31, 0xb6, 0x12, 0x25, 0x9f, 0x38, 0x54,
- 0xf4, 0x31, 0xdc, 0xb4, 0x7b, 0x26, 0xb6, 0x7a, 0x7a, 0xbf, 0xa3, 0x84, 0xf7, 0x8e, 0xd5, 0x7e,
- 0x36, 0xe6, 0x18, 0x9d, 0x7c, 0xc3, 0xd5, 0x70, 0x16, 0xdc, 0xbf, 0x2f, 0x20, 0x45, 0x8f, 0x0d,
- 0x49, 0xfa, 0x5c, 0x2b, 0xce, 0x71, 0x03, 0xfd, 0x04, 0x40, 0xb5, 0x6d, 0x53, 0x3b, 0x1f, 0x11,
- 0xef, 0x10, 0x9f, 0xfc, 0x94, 0x77, 0xec, 0x6a, 0x0e, 0xdf, 0xce, 0x6d, 0x7e, 0xfe, 0xd6, 0x3c,
- 0x51, 0xdf, 0x19, 0xf4, 0x29, 0x94, 0x0e, 0xa1, 0x14, 0x94, 0x75, 0xb2, 0x69, 0x36, 0x86, 0x60,
- 0x36, 0xcd, 0xb2, 0x73, 0x9e, 0x4d, 0xbb, 0xb9, 0x78, 0x82, 0xd5, 0x6c, 0x69, 0x43, 0xfa, 0x41,
- 0x80, 0x82, 0xdf, 0xeb, 0x2d, 0x9c, 0xf0, 0xf2, 0x0b, 0x40, 0x62, 0xf2, 0x02, 0x90, 0xf4, 0xa5,
- 0xc0, 0x37, 0x21, 0x4b, 0x52, 0xe0, 0x91, 0x85, 0x3b, 0xbc, 0x92, 0x9d, 0xe9, 0xaa, 0xd6, 0xa9,
- 0x85, 0x3b, 0x3e, 0xdf, 0x94, 0x79, 0x33, 0xdf, 0x14, 0x4c, 0xa4, 0xb3, 0xa1, 0x44, 0x7a, 0x3f,
- 0x99, 0x4d, 0x89, 0x69, 0xd9, 0x97, 0x89, 0x4b, 0x7f, 0x2d, 0x40, 0xd6, 0x9d, 0x6f, 0xb0, 0x84,
- 0x1b, 0xc0, 0x65, 0xd9, 0x72, 0xb1, 0x02, 0x2e, 0xbf, 0xba, 0xb0, 0x82, 0x76, 0xc2, 0x2d, 0x68,
- 0xff, 0xc6, 0x4d, 0x06, 0xa3, 0x90, 0x47, 0xff, 0xe2, 0x3a, 0x60, 0x33, 0xcf, 0x7d, 0xff, 0x8e,
- 0x8f, 0x83, 0x64, 0x2c, 0xe8, 0x4f, 0x20, 0xad, 0xb6, 0x5d, 0xbc, 0xb5, 0x34, 0x05, 0x88, 0x74,
- 0x58, 0xb7, 0x5a, 0xe3, 0x1a, 0xe5, 0x94, 0xb9, 0x04, 0x1f, 0x55, 0xdc, 0x19, 0x95, 0x74, 0x40,
- 0xf4, 0x32, 0x9e, 0xe0, 0x49, 0x2f, 0x01, 0x9c, 0x1e, 0x3e, 0x3b, 0xda, 0xdd, 0x7b, 0xb2, 0xd7,
- 0xd8, 0xe5, 0xd9, 0xde, 0xee, 0x6e, 0x63, 0x57, 0x8c, 0x13, 0x3e, 0xb9, 0xf1, 0xec, 0xe8, 0xac,
- 0xb1, 0x2b, 0x26, 0x48, 0x63, 0xb7, 0x71, 0x50, 0xfb, 0xa8, 0xb1, 0x2b, 0x26, 0xa5, 0x1a, 0xe4,
- 0xdc, 0xa0, 0x43, 0x2b, 0xff, 0xfa, 0x4b, 0x6c, 0xf2, 0xd5, 0x62, 0x0d, 0xb4, 0x0e, 0xf9, 0xc9,
- 0x82, 0x01, 0xb9, 0xbc, 0xb1, 0x3a, 0x01, 0x09, 0x03, 0x65, 0x57, 0x07, 0x8f, 0x4d, 0xbf, 0x81,
- 0x8c, 0x31, 0x3a, 0x57, 0x1c, 0xdb, 0x0d, 0xc1, 0xec, 0xce, 0xdd, 0x6e, 0x74, 0xde, 0xd7, 0xda,
- 0x4f, 0xf1, 0x15, 0x0f, 0x72, 0x69, 0x63, 0x74, 0xfe, 0x94, 0x99, 0x38, 0x1b, 0x46, 0x7c, 0xc6,
- 0x30, 0x12, 0xa1, 0x61, 0xa0, 0x7b, 0x50, 0x18, 0xea, 0x1d, 0xac, 0xa8, 0x9d, 0x8e, 0x89, 0x2d,
- 0x16, 0xbb, 0x73, 0x5c, 0x73, 0x9e, 0xf4, 0xd4, 0x58, 0x87, 0xf4, 0x9d, 0x00, 0x68, 0x32, 0xd0,
- 0xa2, 0x13, 0x58, 0xf1, 0x62, 0xb5, 0x93, 0x00, 0xb0, 0x48, 0xb0, 0x19, 0x1d, 0xa8, 0x03, 0xf8,
- 0x82, 0x78, 0x19, 0x24, 0x93, 0xac, 0x6f, 0xcd, 0x73, 0x55, 0x06, 0x9d, 0x2f, 0x5d, 0x94, 0xf8,
- 0x82, 0x8b, 0x12, 0x93, 0x91, 0x2b, 0xef, 0xf6, 0x84, 0x5d, 0x69, 0x62, 0xa2, 0xee, 0x64, 0x40,
- 0xa5, 0x35, 0x21, 0xc6, 0xe7, 0x19, 0x35, 0x24, 0xe1, 0x4d, 0x86, 0x24, 0x3d, 0x02, 0xf1, 0x43,
- 0xf7, 0xfb, 0x5e, 0xfe, 0xe8, 0x1f, 0xa6, 0x30, 0x31, 0xcc, 0x4b, 0xc8, 0x12, 0xef, 0x4b, 0x83,
- 0xc6, 0x9f, 0x42, 0xce, 0x5d, 0x3d, 0xf7, 0xf1, 0x50, 0xe4, 0xb2, 0xf3, 0x91, 0x78, 0x22, 0xe8,
- 0x01, 0xac, 0x90, 0xb8, 0xe1, 0x54, 0x7f, 0x19, 0x42, 0x18, 0xa7, 0xde, 0xb0, 0xcc, 0x3a, 0x0e,
- 0x1c, 0x58, 0x8b, 0xc4, 0x68, 0x91, 0xc5, 0x72, 0xdc, 0xf9, 0xff, 0x18, 0x00, 0xb9, 0xf3, 0x85,
- 0x80, 0x52, 0xb6, 0x87, 0xc5, 0x40, 0x32, 0x21, 0xfd, 0x65, 0x1c, 0xf2, 0xbe, 0x6a, 0x14, 0xfa,
- 0xe3, 0x40, 0x62, 0xb5, 0x39, 0xab, 0x72, 0xe5, 0xcb, 0xaa, 0x02, 0x13, 0x8b, 0x2f, 0x3f, 0xb1,
- 0xa8, 0x3a, 0xa0, 0x53, 0x94, 0x4e, 0x2e, 0x5d, 0x94, 0x7e, 0x1b, 0x90, 0xad, 0xdb, 0x6a, 0x9f,
- 0x04, 0x6f, 0x6d, 0xd8, 0x55, 0xd8, 0x69, 0x67, 0x85, 0x70, 0x91, 0xf6, 0x9c, 0xd1, 0x8e, 0x63,
- 0x42, 0x97, 0xfa, 0x90, 0x75, 0x81, 0x89, 0xe5, 0xdf, 0xe4, 0x4c, 0x2b, 0xbe, 0x57, 0x21, 0x3b,
- 0xc0, 0xb6, 0x4a, 0xc3, 0x1e, 0x03, 0xaa, 0xdc, 0xf6, 0x83, 0x0f, 0x20, 0xef, 0x7b, 0xa8, 0x44,
- 0x22, 0xe1, 0x61, 0xe3, 0xb9, 0x18, 0xab, 0x66, 0xbe, 0xfc, 0x7a, 0x33, 0x71, 0x88, 0x5f, 0x92,
- 0x4f, 0xc9, 0x8d, 0x7a, 0xb3, 0x51, 0x7f, 0x2a, 0x0a, 0xd5, 0xfc, 0x97, 0x5f, 0x6f, 0x66, 0x64,
- 0x4c, 0x0b, 0x37, 0x0f, 0x9e, 0x42, 0x39, 0xb4, 0x03, 0x41, 0x07, 0x8d, 0xa0, 0xb4, 0x7b, 0x7a,
- 0x7c, 0xb0, 0x57, 0xaf, 0xb5, 0x1a, 0xca, 0xd9, 0x51, 0xab, 0x21, 0x0a, 0xe8, 0x06, 0xac, 0x1e,
- 0xec, 0xfd, 0x59, 0xb3, 0xa5, 0xd4, 0x0f, 0xf6, 0x1a, 0x87, 0x2d, 0xa5, 0xd6, 0x6a, 0xd5, 0xea,
- 0x4f, 0xc5, 0xf8, 0xc3, 0x7f, 0xc9, 0x43, 0xb9, 0xb6, 0x53, 0xdf, 0xab, 0x19, 0x46, 0x5f, 0x6b,
- 0xab, 0xd4, 0xdd, 0xd7, 0x21, 0x49, 0x51, 0xe7, 0x99, 0x6f, 0xa1, 0xab, 0xb3, 0xab, 0x71, 0xe8,
- 0x09, 0xa4, 0x28, 0x20, 0x8d, 0x66, 0x3f, 0x8e, 0xae, 0xce, 0x29, 0xcf, 0x91, 0xc1, 0xd0, 0x73,
- 0x33, 0xf3, 0xb5, 0x74, 0x75, 0x76, 0xb5, 0x0e, 0x1d, 0x40, 0xc6, 0x01, 0xe3, 0xe6, 0x3d, 0x61,
- 0xae, 0xce, 0x2d, 0xa1, 0x91, 0xa9, 0x31, 0x50, 0x73, 0xf6, 0x43, 0xea, 0xea, 0x9c, 0x3a, 0x1e,
- 0x92, 0x21, 0xe7, 0xc1, 0xdc, 0xf3, 0xdf, 0x74, 0x57, 0x17, 0xa8, 0x2b, 0xa2, 0x4f, 0xa1, 0x18,
- 0x84, 0xed, 0x16, 0x7b, 0x6e, 0x5d, 0x5d, 0xb0, 0xe6, 0x47, 0xf4, 0x07, 0x31, 0xbc, 0xc5, 0x9e,
- 0x5f, 0x57, 0x17, 0x2c, 0x01, 0xa2, 0xcf, 0x60, 0x65, 0x12, 0x63, 0x5b, 0xfc, 0x35, 0x76, 0x75,
- 0x89, 0xa2, 0x20, 0x1a, 0x00, 0x9a, 0x82, 0xcd, 0x2d, 0xf1, 0x38, 0xbb, 0xba, 0x4c, 0x8d, 0x10,
- 0x75, 0x41, 0x9c, 0x78, 0x2e, 0xb7, 0xf0, 0x63, 0xed, 0xea, 0xe2, 0x05, 0x43, 0xd4, 0x81, 0x72,
- 0x18, 0x04, 0x5b, 0xf4, 0xf1, 0x76, 0x75, 0xe1, 0xf2, 0x21, 0xfb, 0x4a, 0x10, 0x8c, 0x59, 0xf4,
- 0x31, 0x77, 0x75, 0xe1, 0x6a, 0x22, 0x3a, 0x05, 0xf0, 0x5d, 0xa2, 0x17, 0x78, 0xdc, 0x5d, 0x5d,
- 0xa4, 0xae, 0x88, 0x0c, 0x58, 0x9d, 0x76, 0x6b, 0x5e, 0xe6, 0xad, 0x77, 0x75, 0xa9, 0x72, 0x23,
- 0x39, 0x38, 0xc1, 0x0b, 0xf0, 0x62, 0x6f, 0xbf, 0xab, 0x0b, 0xd6, 0x1d, 0x77, 0x76, 0xbe, 0x79,
- 0xbd, 0x2e, 0x7c, 0xfb, 0x7a, 0x5d, 0xf8, 0xee, 0xf5, 0xba, 0xf0, 0xd5, 0xf7, 0xeb, 0xb1, 0x6f,
- 0xbf, 0x5f, 0x8f, 0xfd, 0xc7, 0xf7, 0xeb, 0xb1, 0x3f, 0xbf, 0xdf, 0xd5, 0xec, 0xde, 0xe8, 0x7c,
- 0xab, 0xad, 0x0f, 0xe8, 0x7f, 0x7a, 0x0c, 0xf5, 0x6a, 0x9b, 0xe9, 0x24, 0x2d, 0xdf, 0x3f, 0x87,
- 0xce, 0xd3, 0x34, 0xa8, 0x3e, 0xfa, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0c, 0x9b, 0xee, 0x1d,
- 0x59, 0x34, 0x00, 0x00,
+ 0xcc, 0xd5, 0xfc, 0xbf, 0xdc, 0xf4, 0xa8, 0xed, 0x49, 0xfd, 0x1c, 0xdb, 0xd3, 0x84, 0x34, 0xbe,
+ 0xc4, 0x43, 0xdb, 0xaa, 0xa4, 0xe9, 0x8c, 0xaf, 0x4f, 0xce, 0x98, 0x74, 0xef, 0x54, 0x48, 0xee,
+ 0xf3, 0x5f, 0xaf, 0x36, 0x44, 0xc6, 0xfd, 0xb6, 0x3e, 0xd0, 0x6c, 0x3c, 0x30, 0xec, 0x2b, 0x99,
+ 0xcb, 0x4b, 0xef, 0x41, 0x29, 0xb8, 0xe8, 0xd1, 0x2e, 0xc4, 0x73, 0xd2, 0x71, 0xe9, 0xef, 0x05,
+ 0x58, 0x9d, 0x82, 0xe5, 0xa0, 0xc7, 0xbc, 0xa4, 0xc4, 0x36, 0xfe, 0xee, 0xe4, 0xea, 0x05, 0xd8,
+ 0xbd, 0xca, 0x12, 0x09, 0x9a, 0xde, 0xd5, 0x81, 0xed, 0xb1, 0x47, 0x40, 0xbf, 0x86, 0xb2, 0xa5,
+ 0x75, 0x87, 0x8a, 0xc9, 0x60, 0x21, 0xb7, 0x5c, 0x43, 0x32, 0x7b, 0xd2, 0xe1, 0x14, 0x35, 0x3b,
+ 0x24, 0xf3, 0x41, 0x20, 0x2a, 0x21, 0x6e, 0xa9, 0x0d, 0x68, 0xf2, 0x26, 0x33, 0x0d, 0xb8, 0x12,
+ 0xde, 0x00, 0xb8, 0xfa, 0x3b, 0x01, 0x6e, 0xcd, 0xb8, 0xdd, 0xa0, 0x8f, 0x42, 0xe7, 0xe2, 0x83,
+ 0x65, 0xee, 0x46, 0x5b, 0x8c, 0x16, 0x3c, 0x19, 0xd2, 0x23, 0x28, 0xf8, 0xe9, 0x8b, 0x6d, 0xde,
+ 0xbe, 0x17, 0xfb, 0x83, 0x00, 0xdb, 0x5d, 0x28, 0x9a, 0xd8, 0x26, 0x4e, 0x2a, 0x80, 0x48, 0x16,
+ 0x18, 0x91, 0xa5, 0xa9, 0xfb, 0xc9, 0xac, 0x20, 0xc6, 0x5d, 0xfb, 0xf9, 0x57, 0x01, 0xc0, 0x43,
+ 0xdd, 0x3c, 0xd4, 0x4b, 0xf0, 0xa3, 0x5e, 0x21, 0xb0, 0x34, 0x1e, 0x06, 0x4b, 0xd1, 0x3d, 0x28,
+ 0xb3, 0xfb, 0x08, 0xd9, 0x37, 0xd5, 0x1e, 0x99, 0x98, 0x63, 0x6c, 0x25, 0x4a, 0x3e, 0x71, 0xa8,
+ 0xe8, 0x13, 0xb8, 0x69, 0xf7, 0x4c, 0x6c, 0xf5, 0xf4, 0x7e, 0x47, 0x09, 0xef, 0x1d, 0xab, 0xfd,
+ 0x6c, 0xcc, 0x31, 0x3a, 0xf9, 0x86, 0xab, 0xe1, 0x2c, 0xb8, 0x7f, 0x5f, 0x42, 0x8a, 0x1e, 0x1b,
+ 0x92, 0xf4, 0xb9, 0x56, 0x9c, 0xe3, 0x06, 0xfa, 0x29, 0x80, 0x6a, 0xdb, 0xa6, 0x76, 0x3e, 0x22,
+ 0xde, 0x21, 0x3e, 0xf9, 0x29, 0xef, 0xd8, 0xd5, 0x1c, 0xbe, 0x9d, 0xdb, 0xfc, 0xfc, 0xad, 0x79,
+ 0xa2, 0xbe, 0x33, 0xe8, 0x53, 0x28, 0x1d, 0x42, 0x29, 0x28, 0xeb, 0x64, 0xd3, 0x6c, 0x0c, 0xc1,
+ 0x6c, 0x9a, 0x65, 0xe7, 0x3c, 0x9b, 0x76, 0x73, 0xf1, 0x04, 0xab, 0xfe, 0xd2, 0x86, 0xf4, 0xa3,
+ 0x00, 0x05, 0xbf, 0xd7, 0x5b, 0x38, 0xe1, 0xe5, 0x17, 0x80, 0xc4, 0xe4, 0x05, 0x20, 0xe9, 0x4b,
+ 0x81, 0x6f, 0x42, 0x96, 0xa4, 0xc0, 0x23, 0x0b, 0x77, 0x78, 0x4d, 0x3c, 0xd3, 0x55, 0xad, 0x53,
+ 0x0b, 0x77, 0x7c, 0xbe, 0x29, 0xf3, 0x66, 0xbe, 0x29, 0x98, 0x48, 0x67, 0x43, 0x89, 0xf4, 0x7e,
+ 0x32, 0x9b, 0x12, 0xd3, 0xb2, 0x2f, 0x13, 0x97, 0xfe, 0x52, 0x80, 0xac, 0x3b, 0xdf, 0x60, 0x31,
+ 0x38, 0x80, 0xcb, 0xb2, 0xe5, 0x62, 0xa5, 0x60, 0x7e, 0x75, 0x61, 0xa5, 0xf1, 0x84, 0x5b, 0x1a,
+ 0xff, 0x9d, 0x9b, 0x0c, 0x46, 0x21, 0x8f, 0xfe, 0xc5, 0x75, 0xc0, 0x66, 0x9e, 0xfb, 0xfe, 0x2d,
+ 0x1f, 0x07, 0xc9, 0x58, 0xd0, 0x1f, 0x40, 0x5a, 0x6d, 0xbb, 0x78, 0x6b, 0x69, 0x0a, 0x10, 0xe9,
+ 0xb0, 0x6e, 0xb5, 0xc6, 0x35, 0xca, 0x29, 0x73, 0x09, 0x3e, 0xaa, 0xb8, 0x33, 0x2a, 0xe9, 0x80,
+ 0xe8, 0x65, 0x3c, 0xc1, 0x93, 0x5e, 0x02, 0x38, 0x3d, 0x7c, 0x76, 0xb4, 0xbb, 0xf7, 0x64, 0xaf,
+ 0xb1, 0xcb, 0xb3, 0xbd, 0xdd, 0xdd, 0xc6, 0xae, 0x18, 0x27, 0x7c, 0x72, 0xe3, 0xd9, 0xd1, 0x59,
+ 0x63, 0x57, 0x4c, 0x90, 0xc6, 0x6e, 0xe3, 0xa0, 0xf6, 0x71, 0x63, 0x57, 0x4c, 0x4a, 0x35, 0xc8,
+ 0xb9, 0x41, 0x87, 0xbe, 0x21, 0xd0, 0x5f, 0x62, 0x93, 0xaf, 0x16, 0x6b, 0xa0, 0x75, 0xc8, 0x4f,
+ 0x16, 0x0c, 0xc8, 0xe5, 0x8d, 0xd5, 0x09, 0x48, 0x18, 0x28, 0xbb, 0x3a, 0x78, 0x6c, 0xfa, 0x1d,
+ 0x64, 0x8c, 0xd1, 0xb9, 0xe2, 0xd8, 0x6e, 0x08, 0x66, 0x77, 0xee, 0x76, 0xa3, 0xf3, 0xbe, 0xd6,
+ 0x7e, 0x8a, 0xaf, 0x78, 0x90, 0x4b, 0x1b, 0xa3, 0xf3, 0xa7, 0xcc, 0xc4, 0xd9, 0x30, 0xe2, 0x33,
+ 0x86, 0x91, 0x08, 0x0d, 0x03, 0xdd, 0x83, 0xc2, 0x50, 0xef, 0x60, 0x45, 0xed, 0x74, 0x4c, 0x6c,
+ 0xb1, 0xd8, 0x9d, 0xe3, 0x9a, 0xf3, 0xa4, 0xa7, 0xc6, 0x3a, 0xa4, 0xef, 0x05, 0x40, 0x93, 0x81,
+ 0x16, 0x9d, 0xc0, 0x8a, 0x17, 0xab, 0x9d, 0x04, 0x80, 0x45, 0x82, 0xcd, 0xe8, 0x40, 0x1d, 0xc0,
+ 0x17, 0xc4, 0xcb, 0x20, 0x99, 0x64, 0x7d, 0x6b, 0x9e, 0xab, 0x32, 0xe8, 0x7c, 0xe9, 0xa2, 0xc4,
+ 0x17, 0x5c, 0x94, 0x98, 0x8c, 0x5c, 0x79, 0xb7, 0x27, 0xec, 0x4a, 0x13, 0x13, 0x75, 0x27, 0x03,
+ 0x2a, 0xad, 0x09, 0x31, 0x3e, 0xcf, 0xa8, 0x21, 0x09, 0x6f, 0x32, 0x24, 0xe9, 0x11, 0x88, 0x1f,
+ 0xb9, 0xdf, 0xf7, 0xf2, 0x47, 0xff, 0x30, 0x85, 0x89, 0x61, 0x5e, 0x42, 0x96, 0x78, 0x5f, 0x1a,
+ 0x34, 0xfe, 0x08, 0x72, 0xee, 0xea, 0xb9, 0xcf, 0x90, 0x22, 0x97, 0x9d, 0x8f, 0xc4, 0x13, 0x41,
+ 0x0f, 0x60, 0x85, 0xc4, 0x0d, 0xa7, 0xfa, 0xeb, 0xbd, 0x73, 0xc8, 0xca, 0x65, 0xd6, 0x71, 0xe0,
+ 0xc0, 0x5a, 0x24, 0x46, 0x8b, 0x2c, 0x96, 0xe3, 0xce, 0xff, 0xc5, 0x00, 0xc8, 0x9d, 0x2f, 0x04,
+ 0x94, 0xb2, 0x3d, 0x2c, 0x06, 0x92, 0x09, 0xe9, 0xcf, 0xe3, 0x90, 0xf7, 0x55, 0xa3, 0xd0, 0xef,
+ 0x07, 0x12, 0xab, 0xcd, 0x59, 0x95, 0x2b, 0x5f, 0x56, 0x15, 0x98, 0x58, 0x7c, 0xf9, 0x89, 0x45,
+ 0xd5, 0x01, 0x9d, 0xa2, 0x74, 0x72, 0xe9, 0xa2, 0xf4, 0xdb, 0x80, 0x6c, 0xdd, 0x56, 0xfb, 0x24,
+ 0x78, 0x6b, 0xc3, 0xae, 0xc2, 0x4e, 0x3b, 0x2b, 0x84, 0x8b, 0xb4, 0xe7, 0x8c, 0x76, 0x1c, 0x13,
+ 0xba, 0xd4, 0x87, 0xac, 0x0b, 0x4c, 0x2c, 0xff, 0xba, 0x67, 0x5a, 0xf1, 0xbd, 0x0a, 0xd9, 0x01,
+ 0xb6, 0x55, 0x1a, 0xf6, 0x18, 0x50, 0xe5, 0xb6, 0x1f, 0x7c, 0x00, 0x79, 0xdf, 0x93, 0x27, 0x12,
+ 0x09, 0x0f, 0x1b, 0xcf, 0xc5, 0x58, 0x35, 0xf3, 0xd5, 0x37, 0x9b, 0x89, 0x43, 0xfc, 0x92, 0x7c,
+ 0x4a, 0x6e, 0xd4, 0x9b, 0x8d, 0xfa, 0x53, 0x51, 0xa8, 0xe6, 0xbf, 0xfa, 0x66, 0x33, 0x23, 0x63,
+ 0x5a, 0xb8, 0x79, 0xf0, 0x14, 0xca, 0xa1, 0x1d, 0x08, 0x3a, 0x68, 0x04, 0xa5, 0xdd, 0xd3, 0xe3,
+ 0x83, 0xbd, 0x7a, 0xad, 0xd5, 0x50, 0xce, 0x8e, 0x5a, 0x0d, 0x51, 0x40, 0x37, 0x60, 0xf5, 0x60,
+ 0xef, 0x8f, 0x9b, 0x2d, 0xa5, 0x7e, 0xb0, 0xd7, 0x38, 0x6c, 0x29, 0xb5, 0x56, 0xab, 0x56, 0x7f,
+ 0x2a, 0xc6, 0x1f, 0xfe, 0x73, 0x1e, 0xca, 0xb5, 0x9d, 0xfa, 0x5e, 0xcd, 0x30, 0xfa, 0x5a, 0x5b,
+ 0xa5, 0xee, 0xbe, 0x0e, 0x49, 0x8a, 0x3a, 0xcf, 0x7c, 0x55, 0x5d, 0x9d, 0x5d, 0x8d, 0x43, 0x4f,
+ 0x20, 0x45, 0x01, 0x69, 0x34, 0xfb, 0x99, 0x75, 0x75, 0x4e, 0x79, 0x8e, 0x0c, 0x86, 0x9e, 0x9b,
+ 0x99, 0xef, 0xae, 0xab, 0xb3, 0xab, 0x75, 0xe8, 0x00, 0x32, 0x0e, 0x18, 0x37, 0xef, 0x31, 0x74,
+ 0x75, 0x6e, 0x09, 0x8d, 0x4c, 0x8d, 0x81, 0x9a, 0xb3, 0x9f, 0x64, 0x57, 0xe7, 0xd4, 0xf1, 0x90,
+ 0x0c, 0x39, 0x0f, 0xe6, 0x9e, 0xff, 0x3a, 0xbc, 0xba, 0x40, 0x5d, 0x11, 0x7d, 0x06, 0xc5, 0x20,
+ 0x6c, 0xb7, 0xd8, 0xc3, 0xed, 0xea, 0x82, 0x35, 0x3f, 0xa2, 0x3f, 0x88, 0xe1, 0x2d, 0xf6, 0x90,
+ 0xbb, 0xba, 0x60, 0x09, 0x10, 0x7d, 0x0e, 0x2b, 0x93, 0x18, 0xdb, 0xe2, 0xef, 0xba, 0xab, 0x4b,
+ 0x14, 0x05, 0xd1, 0x00, 0xd0, 0x14, 0x6c, 0x6e, 0x89, 0x67, 0xde, 0xd5, 0x65, 0x6a, 0x84, 0xa8,
+ 0x0b, 0xe2, 0xc4, 0xbb, 0xbb, 0x85, 0x9f, 0x7d, 0x57, 0x17, 0x2f, 0x18, 0xa2, 0x0e, 0x94, 0xc3,
+ 0x20, 0xd8, 0xa2, 0xcf, 0xc0, 0xab, 0x0b, 0x97, 0x0f, 0xd9, 0x57, 0x82, 0x60, 0xcc, 0xa2, 0xcf,
+ 0xc2, 0xab, 0x0b, 0x57, 0x13, 0xd1, 0x29, 0x80, 0xef, 0x12, 0xbd, 0xc0, 0x33, 0xf1, 0xea, 0x22,
+ 0x75, 0x45, 0x64, 0xc0, 0xea, 0xb4, 0x5b, 0xf3, 0x32, 0xaf, 0xc6, 0xab, 0x4b, 0x95, 0x1b, 0xc9,
+ 0xc1, 0x09, 0x5e, 0x80, 0x17, 0x7b, 0x45, 0x5e, 0x5d, 0xb0, 0xee, 0xb8, 0xb3, 0xf3, 0xed, 0xeb,
+ 0x75, 0xe1, 0xbb, 0xd7, 0xeb, 0xc2, 0xf7, 0xaf, 0xd7, 0x85, 0xaf, 0x7f, 0x58, 0x8f, 0x7d, 0xf7,
+ 0xc3, 0x7a, 0xec, 0xdf, 0x7f, 0x58, 0x8f, 0xfd, 0xe9, 0xfd, 0xae, 0x66, 0xf7, 0x46, 0xe7, 0x5b,
+ 0x6d, 0x7d, 0x40, 0xff, 0x1d, 0x64, 0xa8, 0x57, 0xdb, 0x4c, 0x27, 0x69, 0xf9, 0xfe, 0x83, 0x74,
+ 0x9e, 0xa6, 0x41, 0xf5, 0xd1, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x18, 0x19, 0x24, 0x60, 0xa3,
+ 0x34, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -6165,9 +6175,21 @@ func (m *RequestFinalizeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error)
_ = i
var l int
_ = l
- if m.LightBlock != nil {
+ if m.GenesisBlock != nil {
{
- size, err := m.LightBlock.MarshalToSizedBuffer(dAtA[:i])
+ size, err := m.GenesisBlock.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x12
+ }
+ if m.SnapshotBlock != nil {
+ {
+ size, err := m.SnapshotBlock.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
@@ -6248,12 +6270,12 @@ func (m *RequestPrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error)
i--
dAtA[i] = 0x3a
}
- n23, err23 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err23 != nil {
- return 0, err23
+ n24, err24 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err24 != nil {
+ return 0, err24
}
- i -= n23
- i = encodeVarintTypes(dAtA, i, uint64(n23))
+ i -= n24
+ i = encodeVarintTypes(dAtA, i, uint64(n24))
i--
dAtA[i] = 0x32
if m.Height != 0 {
@@ -6377,12 +6399,12 @@ func (m *RequestProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error)
i--
dAtA[i] = 0x42
}
- n27, err27 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err27 != nil {
- return 0, err27
+ n28, err28 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err28 != nil {
+ return 0, err28
}
- i -= n27
- i = encodeVarintTypes(dAtA, i, uint64(n27))
+ i -= n28
+ i = encodeVarintTypes(dAtA, i, uint64(n28))
i--
dAtA[i] = 0x3a
if m.Round != 0 {
@@ -7243,12 +7265,12 @@ func (m *ResponseInitChain_GenesisTime) MarshalTo(dAtA []byte) (int, error) {
func (m *ResponseInitChain_GenesisTime) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
if m.GenesisTime != nil {
- n52, err52 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.GenesisTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.GenesisTime):])
- if err52 != nil {
- return 0, err52
+ n53, err53 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.GenesisTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.GenesisTime):])
+ if err53 != nil {
+ return 0, err53
}
- i -= n52
- i = encodeVarintTypes(dAtA, i, uint64(n52))
+ i -= n53
+ i = encodeVarintTypes(dAtA, i, uint64(n53))
i--
dAtA[i] = 0x32
}
@@ -8548,12 +8570,12 @@ func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i--
dAtA[i] = 0x28
}
- n65, err65 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err65 != nil {
- return 0, err65
+ n66, err66 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err66 != nil {
+ return 0, err66
}
- i -= n65
- i = encodeVarintTypes(dAtA, i, uint64(n65))
+ i -= n66
+ i = encodeVarintTypes(dAtA, i, uint64(n66))
i--
dAtA[i] = 0x22
if m.Height != 0 {
@@ -9030,8 +9052,12 @@ func (m *RequestFinalizeSnapshot) Size() (n int) {
}
var l int
_ = l
- if m.LightBlock != nil {
- l = m.LightBlock.Size()
+ if m.SnapshotBlock != nil {
+ l = m.SnapshotBlock.Size()
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ if m.GenesisBlock != nil {
+ l = m.GenesisBlock.Size()
n += 1 + l + sovTypes(uint64(l))
}
return n
@@ -12048,7 +12074,43 @@ func (m *RequestFinalizeSnapshot) Unmarshal(dAtA []byte) error {
switch fieldNum {
case 1:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field LightBlock", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field SnapshotBlock", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.SnapshotBlock == nil {
+ m.SnapshotBlock = &types1.LightBlock{}
+ }
+ if err := m.SnapshotBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field GenesisBlock", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
@@ -12075,10 +12137,10 @@ func (m *RequestFinalizeSnapshot) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- if m.LightBlock == nil {
- m.LightBlock = &types1.LightBlock{}
+ if m.GenesisBlock == nil {
+ m.GenesisBlock = &types1.LightBlock{}
}
- if err := m.LightBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ if err := m.GenesisBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index aff823cc2b..aeeae5d41b 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -372,8 +372,17 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
return sm.State{}, nil, err
}
+ if state.InitialHeight < 1 {
+ return sm.State{}, nil, fmt.Errorf("initial genesis height %d is invalid", state.InitialHeight)
+ }
+ genesisHeight := uint64(state.InitialHeight)
+ genesisBlock, err := s.getStateProvider().LightBlock(ctx, genesisHeight)
+ if err != nil {
+ return sm.State{}, nil, fmt.Errorf("failed to get genesis block at height %d: %w", genesisHeight, err)
+ }
+
// Finalize
- if err := s.finalizeSnapshot(ctx, snapshot, block); err != nil {
+ if err := s.finalizeSnapshot(ctx, snapshot, genesisBlock, block); err != nil {
return sm.State{}, nil, fmt.Errorf("failed to finalize snapshot: %w", err)
}
@@ -579,20 +588,26 @@ func (s *syncer) requestChunk(ctx context.Context, snapshot *snapshot, chunkID t
}
// / finalizeSnapshot sends light block to ABCI app after state sync is done
-func (s *syncer) finalizeSnapshot(ctx context.Context, snapshot *snapshot, block *types.LightBlock) error {
+func (s *syncer) finalizeSnapshot(ctx context.Context, snapshot *snapshot, genesisBlock *types.LightBlock, snapshotBlock *types.LightBlock) error {
s.logger.Info("Finalizing snapshot restoration",
"snapshot", snapshot.Hash.String(),
"height", snapshot.Height,
"version", snapshot.Version,
"app_hash", snapshot.trustedAppHash,
)
- lightBlock, err := block.ToProto()
+
+ snapshotBlockProto, err := snapshotBlock.ToProto()
+ if err != nil {
+ return fmt.Errorf("failed to convert snapshot block %s to proto: %w", snapshotBlock.String(), err)
+ }
+ genesisBlockProto, err := genesisBlock.ToProto()
if err != nil {
- return fmt.Errorf("failed to convert light block %s to proto: %w", lightBlock.String(), err)
+ return fmt.Errorf("failed to convert genesis block %s to proto: %w", genesisBlock.String(), err)
}
_, err = s.conn.FinalizeSnapshot(ctx, &abci.RequestFinalizeSnapshot{
- LightBlock: lightBlock,
+ SnapshotBlock: snapshotBlockProto,
+ GenesisBlock: genesisBlockProto,
})
return err
diff --git a/light/example_test.go b/light/example_test.go
index 55b93fedae..0c899f2d74 100644
--- a/light/example_test.go
+++ b/light/example_test.go
@@ -113,3 +113,89 @@ func TestExampleClient(t *testing.T) {
logger.Info("verified light block", "light-block", lb)
}
+
+// Manually getting light blocks and verifying them.
+func TestClientLocalDevnet(t *testing.T) {
+ const CHAINID = "dashmate_local_37"
+
+ if testing.Short() {
+ t.Skip("skipping test in short mode")
+ }
+
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ logger, err := log.NewDefaultLogger(log.LogFormatPlain, log.LogLevelTrace)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Start a test application
+ // app, err := kvstore.NewMemoryApp()
+ // require.NoError(t, err)
+
+ primary, err := httpp.New(CHAINID, "10.56.229.104:34657")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // give Tendermint time to generate some blocks
+ time.Sleep(5 * time.Second)
+
+ _, err = primary.LightBlock(ctx, 1)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ db := dbm.NewMemDB()
+
+ // pv, err := privval.LoadOrGenFilePV(conf.PrivValidator.KeyFile(), conf.PrivValidator.StateFile())
+ require.NoError(t, err)
+ coreClient, err := dashcore.NewRPCClient("10.56.229.104:30002",
+ "tenderdash", "I3MFP6SmzDG0",
+ logger)
+ require.NoError(t, err)
+
+ c, err := light.NewClientAtHeight(
+ ctx,
+ 1,
+ CHAINID,
+ primary,
+ nil,
+ dbs.New(db),
+ coreClient,
+ light.Logger(logger),
+ )
+
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer func() {
+ if err := c.Cleanup(); err != nil {
+ t.Fatal(err)
+ }
+ }()
+
+ // wait for a few more blocks to be produced
+ time.Sleep(2 * time.Second)
+
+ // verify the block at height 3
+ _, err = c.VerifyLightBlockAtHeight(ctx, 3, time.Now())
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // retrieve light block at height 3
+ _, err = c.TrustedLightBlock(3)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // update to the latest height
+ lb, err := c.Update(ctx, time.Now())
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ logger.Info("verified light block", "light-block", lb)
+}
diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto
index 4b67f05b38..6963cd792e 100644
--- a/proto/tendermint/abci/types.proto
+++ b/proto/tendermint/abci/types.proto
@@ -191,8 +191,10 @@ message RequestApplySnapshotChunk {
// If the application fails to validate the light block, it should return error in the response.
// This is considered fatal, non-recoverable consensus failure and will cause Tenderdash to restart.
message RequestFinalizeSnapshot {
- // light block committed at the synced height
- tendermint.types.LightBlock light_block = 1;
+ // Snapshot block is a block at which the snapshot was taken.
+ tendermint.types.LightBlock snapshot_block = 1;
+ // Genesis block is the first block of the chain
+ tendermint.types.LightBlock genesis_block = 2;
}
// Prepare new block proposal, potentially altering list of transactions.
diff --git a/spec/abci++/api.md b/spec/abci++/api.md
index c1310169fc..aff911a8b5 100644
--- a/spec/abci++/api.md
+++ b/spec/abci++/api.md
@@ -440,7 +440,8 @@ This is considered fatal, non-recoverable consensus failure and will cause Tende
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
-| light_block | [tendermint.types.LightBlock](#tendermint-types-LightBlock) | | light block committed at the synced height |
+| snapshot_block | [tendermint.types.LightBlock](#tendermint-types-LightBlock) | | Snapshot block is a block at which the snapshot was taken. |
+| genesis_block | [tendermint.types.LightBlock](#tendermint-types-LightBlock) | | Genesis block is the first block of the chain |
From 9d3dae43c3803d5372e2b45a087fd1c0f46192fe Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 13:28:41 +0100
Subject: [PATCH 21/42] chore: fix lint warning
---
test/e2e/pkg/mockcoreserver/core_server.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/e2e/pkg/mockcoreserver/core_server.go b/test/e2e/pkg/mockcoreserver/core_server.go
index fbe9d149ed..5aa2b7b0c2 100644
--- a/test/e2e/pkg/mockcoreserver/core_server.go
+++ b/test/e2e/pkg/mockcoreserver/core_server.go
@@ -146,7 +146,7 @@ func (c *MockCoreServer) QuorumVerify(ctx context.Context, cmd btcjson.QuorumCmd
signatureVerified := thresholdPublicKey.VerifySignatureDigest(signID, signature)
- res := btcjson.QuorumVerifyResult(signatureVerified)
+ res := btcjson.QuorumVerifyResult{Result: signatureVerified}
return res
}
From 4a75455dc1205e063b267acd98a9ed2ff2a696af Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 13:37:29 +0100
Subject: [PATCH 22/42] chore: update kvstore for changed
requestfinalizesnapshot
---
abci/example/kvstore/kvstore.go | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/abci/example/kvstore/kvstore.go b/abci/example/kvstore/kvstore.go
index 7fffaa810e..93da95fce3 100644
--- a/abci/example/kvstore/kvstore.go
+++ b/abci/example/kvstore/kvstore.go
@@ -584,15 +584,21 @@ func (app *Application) FinalizeSnapshot(_ctx context.Context, req *abci.Request
app.mu.Lock()
defer app.mu.Unlock()
- // we verify snapshot height and app hash, as there is no additional logic to be called here
- if app.LastCommittedState.GetHeight() != req.LightBlock.SignedHeader.Header.Height {
+ // we only run some verifications here
+
+ if app.LastCommittedState.GetHeight() != req.SnapshotBlock.SignedHeader.Header.Height {
return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot height mismatch: expected %d, got %d",
- app.LastCommittedState.GetHeight(), req.LightBlock.SignedHeader.Header.Height)
+ app.LastCommittedState.GetHeight(), req.SnapshotBlock.SignedHeader.Header.Height)
}
- if !app.LastCommittedState.GetAppHash().Equal(req.LightBlock.SignedHeader.Header.AppHash) {
+ if !app.LastCommittedState.GetAppHash().Equal(req.SnapshotBlock.SignedHeader.Header.AppHash) {
return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot apphash mismatch: expected %x, got %x",
- app.LastCommittedState.GetAppHash(), req.LightBlock.SignedHeader.Header.AppHash)
+ app.LastCommittedState.GetAppHash(), req.SnapshotBlock.SignedHeader.Header.AppHash)
+ }
+
+ if app.initialHeight != req.GenesisBlock.SignedHeader.Header.Height {
+ return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("genesis height mismatch: expected %d, got %d",
+ app.initialHeight, req.GenesisBlock.SignedHeader.Header.Height)
}
app.logger.Debug("FinalizeSnapshot finished successfully", "req", req)
From ef394e8941b492491977c004529c4917c3faa387 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 13:41:48 +0100
Subject: [PATCH 23/42] test: fix failing test
---
internal/statesync/syncer_test.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/internal/statesync/syncer_test.go b/internal/statesync/syncer_test.go
index 4c116b1617..c811f71590 100644
--- a/internal/statesync/syncer_test.go
+++ b/internal/statesync/syncer_test.go
@@ -83,7 +83,7 @@ func (suite *SyncerTestSuite) TestSyncAny() {
},
Software: version.TMCoreSemVer,
},
-
+ InitialHeight: 1,
LastBlockHeight: 1,
LastBlockID: types.BlockID{Hash: []byte("blockhash")},
LastBlockTime: time.Now(),
From 94c5f697293b917698f3800c2a989c604c8f5333 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 13:44:40 +0100
Subject: [PATCH 24/42] chore: remove tmp code
---
light/example_test.go | 86 -------------------------------------------
1 file changed, 86 deletions(-)
diff --git a/light/example_test.go b/light/example_test.go
index 0c899f2d74..55b93fedae 100644
--- a/light/example_test.go
+++ b/light/example_test.go
@@ -113,89 +113,3 @@ func TestExampleClient(t *testing.T) {
logger.Info("verified light block", "light-block", lb)
}
-
-// Manually getting light blocks and verifying them.
-func TestClientLocalDevnet(t *testing.T) {
- const CHAINID = "dashmate_local_37"
-
- if testing.Short() {
- t.Skip("skipping test in short mode")
- }
-
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
-
- logger, err := log.NewDefaultLogger(log.LogFormatPlain, log.LogLevelTrace)
- if err != nil {
- t.Fatal(err)
- }
-
- // Start a test application
- // app, err := kvstore.NewMemoryApp()
- // require.NoError(t, err)
-
- primary, err := httpp.New(CHAINID, "10.56.229.104:34657")
- if err != nil {
- t.Fatal(err)
- }
-
- // give Tendermint time to generate some blocks
- time.Sleep(5 * time.Second)
-
- _, err = primary.LightBlock(ctx, 1)
- if err != nil {
- t.Fatal(err)
- }
-
- db := dbm.NewMemDB()
-
- // pv, err := privval.LoadOrGenFilePV(conf.PrivValidator.KeyFile(), conf.PrivValidator.StateFile())
- require.NoError(t, err)
- coreClient, err := dashcore.NewRPCClient("10.56.229.104:30002",
- "tenderdash", "I3MFP6SmzDG0",
- logger)
- require.NoError(t, err)
-
- c, err := light.NewClientAtHeight(
- ctx,
- 1,
- CHAINID,
- primary,
- nil,
- dbs.New(db),
- coreClient,
- light.Logger(logger),
- )
-
- if err != nil {
- t.Fatal(err)
- }
- defer func() {
- if err := c.Cleanup(); err != nil {
- t.Fatal(err)
- }
- }()
-
- // wait for a few more blocks to be produced
- time.Sleep(2 * time.Second)
-
- // verify the block at height 3
- _, err = c.VerifyLightBlockAtHeight(ctx, 3, time.Now())
- if err != nil {
- t.Fatal(err)
- }
-
- // retrieve light block at height 3
- _, err = c.TrustedLightBlock(3)
- if err != nil {
- t.Fatal(err)
- }
-
- // update to the latest height
- lb, err := c.Update(ctx, time.Now())
- if err != nil {
- t.Fatal(err)
- }
-
- logger.Info("verified light block", "light-block", lb)
-}
From a3262262798ed50f626d0624426992218c34b8bb Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 13:55:28 +0100
Subject: [PATCH 25/42] chore: improve safemath lib
---
libs/math/safemath.go | 147 +++++++++++++++++++++++++++++++++++++
libs/math/safemath_test.go | 105 ++++++++++++++++++++++++++
2 files changed, 252 insertions(+)
diff --git a/libs/math/safemath.go b/libs/math/safemath.go
index 9afb409b21..54f0b7a4f7 100644
--- a/libs/math/safemath.go
+++ b/libs/math/safemath.go
@@ -8,9 +8,11 @@ import (
var ErrOverflowInt64 = errors.New("int64 overflow")
var ErrOverflowInt32 = errors.New("int32 overflow")
+var ErrOverflowUint64 = errors.New("uint64 overflow")
var ErrOverflowUint32 = errors.New("uint32 overflow")
var ErrOverflowUint8 = errors.New("uint8 overflow")
var ErrOverflowInt8 = errors.New("int8 overflow")
+var ErrOverflow = errors.New("integer overflow")
// SafeAddClipInt64 adds two int64 integers and clips the result to the int64 range.
func SafeAddClipInt64(a, b int64) int64 {
@@ -94,10 +96,106 @@ func SafeConvertUint32[T Integer](a T) (uint32, error) {
return uint32(a), nil
}
+// SafeConvertUint64 takes a int and checks if it overflows.
+func SafeConvertUint64[T Integer](a T) (uint64, error) {
+ return SafeConvert[T, uint64](a)
+}
+
+// SafeConvertInt64 takes a int and checks if it overflows.
+func SafeConvertInt64[T Integer](a T) (int64, error) {
+ return SafeConvert[T, int64](a)
+}
+
+// SafeConvertInt16 takes a int and checks if it overflows.
+func SafeConvertInt16[T Integer](a T) (int16, error) {
+ return SafeConvert[T, int16](a)
+}
+
+// SafeConvertUint16 takes a int and checks if it overflows.
+func SafeConvertUint16[T Integer](a T) (uint16, error) {
+ return SafeConvert[T, uint16](a)
+}
+
type Integer interface {
~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64
}
+// SafeConvert converts a value of type T to a value of type U.
+// It returns an error if the conversion would cause an overflow.
+func SafeConvert[T Integer, U Integer](from T) (U, error) {
+ const uintIsSmall = math.MaxUint < math.MaxUint64
+ const intIsSmall = math.MaxInt < math.MaxInt64 && math.MinInt > math.MinInt64
+
+ // special case for int64 and uint64 inputs; all other types are safe to convert to int64
+ switch any(from).(type) {
+ case int64:
+ // conversion from int64 to uint64 - we need to check for negative values
+ if _, ok := any(U(0)).(uint64); ok && from < 0 {
+ return 0, ErrOverflow
+ }
+ return U(from), nil
+ case uint64:
+ // conversion from uint64 to int64 - we need to check for overflow
+ if _, ok := any(U(0)).(int64); ok && uint64(from) > math.MaxInt64 {
+ return 0, ErrOverflow
+ }
+ return U(from), nil
+ case int:
+ if !intIsSmall {
+ return SafeConvert[int64, U](int64(from))
+ }
+ // no return here - it's safe to use normal logic
+ case uint:
+ if !uintIsSmall {
+ return SafeConvert[uint64, U](uint64(from))
+ }
+ // no return here - it's safe to use normal logic
+ }
+ if uint64(from) > Max[U]() {
+ return 0, ErrOverflow
+ }
+ if int64(from) < Min[U]() {
+ return 0, ErrOverflow
+ }
+ return U(from), nil
+}
+
+func MustConvert[FROM Integer, TO Integer](a FROM) TO {
+ i, err := SafeConvert[FROM, TO](a)
+ if err != nil {
+ panic(fmt.Errorf("cannot convert %d to %T: %w", a, any(i), err))
+ }
+ return i
+}
+
+func MustConvertUint64[T Integer](a T) uint64 {
+ return MustConvert[T, uint64](a)
+}
+
+func MustConvertInt64[T Integer](a T) int64 {
+ return MustConvert[T, int64](a)
+}
+
+func MustConvertUint16[T Integer](a T) uint16 {
+ return MustConvert[T, uint16](a)
+}
+
+func MustConvertInt16[T Integer](a T) int16 {
+ return MustConvert[T, int16](a)
+}
+
+func MustConvertUint8[T Integer](a T) uint8 {
+ return MustConvert[T, uint8](a)
+}
+
+func MustConvertUint[T Integer](a T) uint {
+ return MustConvert[T, uint](a)
+}
+
+func MustConvertInt[T Integer](a T) int {
+ return MustConvert[T, int](a)
+}
+
// MustConvertInt32 takes an Integer and converts it to int32.
// Panics if the conversion overflows.
func MustConvertInt32[T Integer](a T) int32 {
@@ -159,3 +257,52 @@ func SafeMulInt64(a, b int64) (int64, bool) {
return a * b, false
}
+
+// Max returns the maximum value for a type T.
+func Max[T Integer]() uint64 {
+ var max T
+ switch any(max).(type) {
+ case int:
+ return uint64(math.MaxInt)
+ case int8:
+ return uint64(math.MaxInt8)
+ case int16:
+ return uint64(math.MaxInt16)
+ case int32:
+ return uint64(math.MaxInt32)
+ case int64:
+ return uint64(math.MaxInt64)
+ case uint:
+ return uint64(math.MaxUint)
+ case uint8:
+ return uint64(math.MaxUint8)
+ case uint16:
+ return uint64(math.MaxUint16)
+ case uint32:
+ return uint64(math.MaxUint32)
+ case uint64:
+ return uint64(math.MaxUint64)
+ default:
+ panic("unsupported type")
+ }
+}
+
+// Min returns the minimum value for a type T.
+func Min[T Integer]() int64 {
+ switch any(T(0)).(type) {
+ case int:
+ return int64(math.MinInt)
+ case int8:
+ return int64(math.MinInt8)
+ case int16:
+ return int64(math.MinInt16)
+ case int32:
+ return int64(math.MinInt32)
+ case int64:
+ return math.MinInt64
+ case uint, uint8, uint16, uint32, uint64:
+ return 0
+ default:
+ panic("unsupported type")
+ }
+}
diff --git a/libs/math/safemath_test.go b/libs/math/safemath_test.go
index 92a8f32110..98a57e1163 100644
--- a/libs/math/safemath_test.go
+++ b/libs/math/safemath_test.go
@@ -84,3 +84,108 @@ func TestSafeMul(t *testing.T) {
assert.Equal(t, tc.overflow, overflow, "#%d", i)
}
}
+
+func TestSafeConvert(t *testing.T) {
+ testCases := []struct {
+ from interface{}
+ want interface{}
+ err bool
+ }{
+ {int(0), int64(0), false},
+ {int(math.MaxInt), int64(math.MaxInt), false},
+ {int(math.MinInt), int64(math.MinInt), false},
+ {uint(0), uint64(0), false},
+ {uint(math.MaxUint), uint64(math.MaxUint), false},
+ {int64(0), uint64(0), false},
+ {int64(math.MaxInt64), uint64(math.MaxInt64), false},
+ {int64(math.MinInt64), uint64(0), true},
+ {uint64(math.MaxUint64), int64(0), true},
+ {uint64(math.MaxInt64), int64(math.MaxInt64), false},
+ {int32(-1), uint32(0), true},
+ {int32(0), uint32(0), false},
+ {int32(math.MaxInt32), uint32(math.MaxInt32), false},
+ {int32(math.MaxInt32), int16(0), true},
+ {int32(math.MinInt32), int16(0), true},
+ {int32(0), int16(0), false},
+ {uint32(math.MaxUint32), int32(0), true},
+ {uint32(math.MaxInt32), int32(math.MaxInt32), false},
+ {uint32(0), int32(0), false},
+ {int16(0), uint32(0), false},
+ {int16(-1), uint32(0), true},
+ {int16(math.MaxInt16), uint32(math.MaxInt16), false},
+ }
+
+ for i, tc := range testCases {
+ var result interface{}
+ var err error
+
+ switch from := tc.from.(type) {
+ case int:
+ switch tc.want.(type) {
+ case int64:
+ result, err = SafeConvert[int, int64](from)
+ default:
+ t.Fatalf("test case %d: unsupported target type %T", i, tc.want)
+ }
+ case uint:
+ switch tc.want.(type) {
+ case uint64:
+ result, err = SafeConvert[uint, uint64](from)
+ default:
+ t.Fatalf("test case %d: unsupported target type %T", i, tc.want)
+ }
+ case int64:
+ switch tc.want.(type) {
+ case uint64:
+ result, err = SafeConvert[int64, uint64](from)
+ case int64:
+ result, err = SafeConvert[int64, int64](from)
+ default:
+ t.Fatalf("test case %d: unsupported target type %T", i, tc.want)
+ }
+ case uint64:
+ switch tc.want.(type) {
+ case int64:
+ result, err = SafeConvert[uint64, int64](from)
+ default:
+ t.Fatalf("test case %d: unsupported target type %T", i, tc.want)
+ }
+ case int32:
+ switch tc.want.(type) {
+ case int16:
+ result, err = SafeConvert[int32, int16](from)
+ case uint32:
+ result, err = SafeConvert[int32, uint32](from)
+ default:
+ t.Fatalf("test case %d: unsupported target type %T", i, tc.want)
+ }
+ case uint32:
+ switch tc.want.(type) {
+ case int16:
+ result, err = SafeConvert[uint32, int16](from)
+ case int32:
+ result, err = SafeConvert[uint32, int32](from)
+ default:
+ t.Fatalf("test case %d: unsupported target type %T", i, tc.want)
+ }
+ case int16:
+ switch tc.want.(type) {
+ case int32:
+ result, err = SafeConvert[int16, int32](from)
+ case uint32:
+ result, err = SafeConvert[int16, uint32](from)
+ default:
+ t.Fatalf("test case %d: unsupported target type %T", i, tc.want)
+ }
+ default:
+ t.Fatalf("test case %d: unsupported source type %T", i, tc.from)
+ }
+
+ if (err != nil) != tc.err {
+ t.Errorf("test case %d: expected error %v, got %v", i, tc.err, err)
+ }
+ if err == nil && result != tc.want {
+ t.Errorf("test case %d: expected result %v, got %v", i, tc.want, result)
+ }
+ }
+}
From 81367dabec2146fee0e1c12ebb7775fcd9c5693d Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 13:59:08 +0100
Subject: [PATCH 26/42] chore: fix linter
---
internal/statesync/syncer.go | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index aeeae5d41b..396c5181f9 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -16,6 +16,7 @@ import (
sm "github.com/dashpay/tenderdash/internal/state"
tmbytes "github.com/dashpay/tenderdash/libs/bytes"
"github.com/dashpay/tenderdash/libs/log"
+ tmmath "github.com/dashpay/tenderdash/libs/math"
"github.com/dashpay/tenderdash/light"
ssproto "github.com/dashpay/tenderdash/proto/tendermint/statesync"
"github.com/dashpay/tenderdash/types"
@@ -215,7 +216,7 @@ func (s *syncer) SyncAny(
switch {
case err == nil:
s.metrics.SnapshotHeight.Set(float64(snapshot.Height))
- s.lastSyncedSnapshotHeight = int64(snapshot.Height)
+ s.lastSyncedSnapshotHeight = tmmath.MustConvertInt64(snapshot.Height)
return newState, commit, nil
case errors.Is(err, errAbort):
@@ -375,7 +376,8 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
if state.InitialHeight < 1 {
return sm.State{}, nil, fmt.Errorf("initial genesis height %d is invalid", state.InitialHeight)
}
- genesisHeight := uint64(state.InitialHeight)
+
+ genesisHeight := tmmath.MustConvertUint64(state.InitialHeight)
genesisBlock, err := s.getStateProvider().LightBlock(ctx, genesisHeight)
if err != nil {
return sm.State{}, nil, fmt.Errorf("failed to get genesis block at height %d: %w", genesisHeight, err)
From fcfa0718b2482cf84273a300f267d0244a88dd6a Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 14:39:10 +0100
Subject: [PATCH 27/42] chore: code rabbit fixes
---
abci/example/kvstore/kvstore.go | 6 +++---
internal/statesync/syncer.go | 5 ++++-
libs/math/safemath.go | 3 ++-
3 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/abci/example/kvstore/kvstore.go b/abci/example/kvstore/kvstore.go
index 93da95fce3..6b8c91939a 100644
--- a/abci/example/kvstore/kvstore.go
+++ b/abci/example/kvstore/kvstore.go
@@ -587,17 +587,17 @@ func (app *Application) FinalizeSnapshot(_ctx context.Context, req *abci.Request
// we only run some verifications here
if app.LastCommittedState.GetHeight() != req.SnapshotBlock.SignedHeader.Header.Height {
- return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot height mismatch: expected %d, got %d",
+ return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot height mismatch during state sync finalization: expected %d, got %d",
app.LastCommittedState.GetHeight(), req.SnapshotBlock.SignedHeader.Header.Height)
}
if !app.LastCommittedState.GetAppHash().Equal(req.SnapshotBlock.SignedHeader.Header.AppHash) {
- return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot apphash mismatch: expected %x, got %x",
+ return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot apphash mismatch during state sync finalization: expected %x, got %x",
app.LastCommittedState.GetAppHash(), req.SnapshotBlock.SignedHeader.Header.AppHash)
}
if app.initialHeight != req.GenesisBlock.SignedHeader.Header.Height {
- return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("genesis height mismatch: expected %d, got %d",
+ return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("genesis height mismatch during state sync finalization: expected %d, got %d",
app.initialHeight, req.GenesisBlock.SignedHeader.Header.Height)
}
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index 396c5181f9..74e004d9b2 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -362,7 +362,7 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
return sm.State{}, nil,
fmt.Errorf("failed to get light block at height %d. No witnesses remaining", snapshot.Height)
}
- s.logger.Info("failed to get and verify light block. Dropping snapshot and trying again",
+ s.logger.Error("failed to get and verify light block. Dropping snapshot and trying again",
"err", err, "height", snapshot.Height)
return sm.State{}, nil, errRejectSnapshot
}
@@ -597,6 +597,9 @@ func (s *syncer) finalizeSnapshot(ctx context.Context, snapshot *snapshot, genes
"version", snapshot.Version,
"app_hash", snapshot.trustedAppHash,
)
+ if genesisBlock == nil || snapshotBlock == nil {
+ return fmt.Errorf("nil block provided: genesis=%v snapshot=%v", genesisBlock == nil, snapshotBlock == nil)
+ }
snapshotBlockProto, err := snapshotBlock.ToProto()
if err != nil {
diff --git a/libs/math/safemath.go b/libs/math/safemath.go
index 54f0b7a4f7..d9cd31df45 100644
--- a/libs/math/safemath.go
+++ b/libs/math/safemath.go
@@ -163,7 +163,8 @@ func SafeConvert[T Integer, U Integer](from T) (U, error) {
func MustConvert[FROM Integer, TO Integer](a FROM) TO {
i, err := SafeConvert[FROM, TO](a)
if err != nil {
- panic(fmt.Errorf("cannot convert %d to %T: %w", a, any(i), err))
+ var zero TO
+ panic(fmt.Errorf("cannot convert %d to %T: %w", a, zero, err))
}
return i
}
From 37f8b5f88e809bb207901a14e9781922ffe4373c Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Tue, 21 Jan 2025 10:32:35 +0100
Subject: [PATCH 28/42] build(deps): update dashd-go to 0.26.1
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 206c9179cd..a5e786e8a3 100644
--- a/go.mod
+++ b/go.mod
@@ -9,7 +9,7 @@ require (
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce
github.com/containerd/continuity v0.4.4 // indirect
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8
- github.com/dashpay/dashd-go v0.26.1-0.20250120114940-580cb9149de7
+ github.com/dashpay/dashd-go v0.26.1
github.com/dashpay/dashd-go/btcec/v2 v2.2.0 // indirect
github.com/fortytw2/leaktest v1.3.0
github.com/fxamacker/cbor/v2 v2.4.0
diff --git a/go.sum b/go.sum
index 003b6b49cb..cb2ead02f3 100644
--- a/go.sum
+++ b/go.sum
@@ -220,8 +220,8 @@ github.com/daixiang0/gci v0.13.5 h1:kThgmH1yBmZSBCh1EJVxQ7JsHpm5Oms0AMed/0LaH4c=
github.com/daixiang0/gci v0.13.5/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk=
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8 h1:v4K3CiDoFY1gjcWL/scRcwzyjBwh8TVG3ek8cWolK1g=
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8/go.mod h1:auvGS60NBZ+a21aCCQh366PdsjDvHinsCvl28VrYPu4=
-github.com/dashpay/dashd-go v0.26.1-0.20250120114940-580cb9149de7 h1:Er4zUGcd9UKXBPCbLBaclSxsMNUsK3fW2elJGTYSnJs=
-github.com/dashpay/dashd-go v0.26.1-0.20250120114940-580cb9149de7/go.mod h1:7KKS2jSPkC1pTz9WLXpiXZ96wT5bUqKTRuk35AyRQ74=
+github.com/dashpay/dashd-go v0.26.1 h1:/ZFgtPw1fPHpvoJgKfXo/v63ZXddjJm8KrHRpxcSpy0=
+github.com/dashpay/dashd-go v0.26.1/go.mod h1:7KKS2jSPkC1pTz9WLXpiXZ96wT5bUqKTRuk35AyRQ74=
github.com/dashpay/dashd-go/btcec/v2 v2.2.0 h1:tk54BC++OvOUu0vcPoG8+45dGoJXKsmupYAawBO/1Vk=
github.com/dashpay/dashd-go/btcec/v2 v2.2.0/go.mod h1:uOmCM/hVoJ1x6w+3SX+zQv+2LdrK3aO59RV41jNvTF4=
github.com/dashpay/dashd-go/btcutil v1.3.0 h1:yDX8tz7C/KhFHbGlRXBpNN+zlkmAgwkICD9DlAv/Vsc=
From d595b00db8b7a32fb2204dccc4f55c59a40e65dd Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Fri, 24 Jan 2025 11:15:52 +0100
Subject: [PATCH 29/42] fix(client): missing response to finalize snapshot in
switch
---
abci/client/socket_client.go | 2 ++
1 file changed, 2 insertions(+)
diff --git a/abci/client/socket_client.go b/abci/client/socket_client.go
index e80fe9d998..4ca9e0739b 100644
--- a/abci/client/socket_client.go
+++ b/abci/client/socket_client.go
@@ -437,6 +437,8 @@ func resMatchesReq(req *types.Request, res *types.Response) (ok bool) {
_, ok = res.Value.(*types.Response_ListSnapshots)
case *types.Request_OfferSnapshot:
_, ok = res.Value.(*types.Response_OfferSnapshot)
+ case *types.Request_FinalizeSnapshot:
+ _, ok = res.Value.(*types.Response_FinalizeSnapshot)
case *types.Request_FinalizeBlock:
_, ok = res.Value.(*types.Response_FinalizeBlock)
}
From a9ac3080263ece355baa662b6c3e9d61986de9c6 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 27 Jan 2025 12:13:06 +0100
Subject: [PATCH 30/42] fix(statesync): repeat image discovery when needed
---
internal/statesync/syncer.go | 17 ++++-------------
1 file changed, 4 insertions(+), 13 deletions(-)
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index 74e004d9b2..baa53f559d 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -157,19 +157,6 @@ func (s *syncer) SyncAny(
timer := time.NewTimer(discoveryTime)
defer timer.Stop()
- if discoveryTime > 0 {
- if err := requestSnapshots(); err != nil {
- return sm.State{}, nil, err
- }
- s.logger.Info("discovering snapshots",
- "interval", discoveryTime)
- select {
- case <-ctx.Done():
- return sm.State{}, nil, ctx.Err()
- case <-timer.C:
- }
- }
-
// The app may ask us to retry a snapshot restoration, in which case we need to reuse
// the snapshot and chunk queue from the previous loop iteration.
var (
@@ -190,6 +177,10 @@ func (s *syncer) SyncAny(
if discoveryTime == 0 {
return sm.State{}, nil, errNoSnapshots
}
+ // we re-request snapshots
+ if err := requestSnapshots(); err != nil {
+ return sm.State{}, nil, err
+ }
s.logger.Info("discovering snapshots",
"iterations", iters,
"interval", discoveryTime)
From 3867717cac4baed41fdceca8d72f58596baa6aa1 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 27 Jan 2025 13:03:31 +0100
Subject: [PATCH 31/42] chore(statesync): retry snapshot when light block is
not returned correctly
---
internal/statesync/syncer.go | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index baa53f559d..627cc38059 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -18,6 +18,7 @@ import (
"github.com/dashpay/tenderdash/libs/log"
tmmath "github.com/dashpay/tenderdash/libs/math"
"github.com/dashpay/tenderdash/light"
+ "github.com/dashpay/tenderdash/light/provider"
ssproto "github.com/dashpay/tenderdash/proto/tendermint/statesync"
"github.com/dashpay/tenderdash/types"
)
@@ -121,6 +122,8 @@ func (s *syncer) AddSnapshot(peerID types.NodeID, snapshot *snapshot) (bool, err
"height", snapshot.Height,
"version", snapshot.Version,
"hash", snapshot.Hash.ShortString())
+ } else {
+ s.logger.Debug("snapshot not added", "height", snapshot.Height, "hash", snapshot.Hash)
}
return added, nil
}
@@ -334,7 +337,12 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
if ctx.Err() != nil {
return sm.State{}, nil, ctx.Err()
}
- if err == light.ErrNoWitnesses {
+ // light block might not be found because it needs commit which is generated at `height+1`, so we
+ if errors.Is(err, provider.ErrLightBlockNotFound) {
+ s.logger.Debug("light block not found at height %d, retrying", "height", snapshot.Height)
+ return sm.State{}, nil, errRetrySnapshot
+ }
+ if errors.Is(err, light.ErrNoWitnesses) {
return sm.State{}, nil,
fmt.Errorf("failed to get tendermint state at height %d. No witnesses remaining", snapshot.Height)
}
From 1973905b6dddcc0974e5f80bdfdbfa668134ae7d Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 27 Jan 2025 16:07:42 +0100
Subject: [PATCH 32/42] fix(statesync): don't offer snapshots when light block
is not available
---
internal/statesync/reactor.go | 7 +++++++
internal/statesync/syncer.go | 6 ------
2 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index 4ed4a89f07..6070e3a14f 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -1061,6 +1061,13 @@ func (r *Reactor) recentSnapshots(ctx context.Context, n uint32) ([]*snapshot, e
break
}
+ // we only accept snapshots where next block is already finalized, that is we are voting
+ // for `height + 2` or higher, because we need to be able to fetch light block containing
+ // commit for `height` from block store (which is stored in block `height+1`)
+ if s.Height <= uint64(r.csState.GetRoundState().Height)-2 {
+ continue
+ }
+
snapshots = append(snapshots, &snapshot{
Height: s.Height,
Version: s.Version,
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index 627cc38059..665ad5c3e5 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -18,7 +18,6 @@ import (
"github.com/dashpay/tenderdash/libs/log"
tmmath "github.com/dashpay/tenderdash/libs/math"
"github.com/dashpay/tenderdash/light"
- "github.com/dashpay/tenderdash/light/provider"
ssproto "github.com/dashpay/tenderdash/proto/tendermint/statesync"
"github.com/dashpay/tenderdash/types"
)
@@ -337,11 +336,6 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
if ctx.Err() != nil {
return sm.State{}, nil, ctx.Err()
}
- // light block might not be found because it needs commit which is generated at `height+1`, so we
- if errors.Is(err, provider.ErrLightBlockNotFound) {
- s.logger.Debug("light block not found at height %d, retrying", "height", snapshot.Height)
- return sm.State{}, nil, errRetrySnapshot
- }
if errors.Is(err, light.ErrNoWitnesses) {
return sm.State{}, nil,
fmt.Errorf("failed to get tendermint state at height %d. No witnesses remaining", snapshot.Height)
From aece08c74f6e3e96de9b17080bdec99dbc21e866 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 27 Jan 2025 16:42:45 +0100
Subject: [PATCH 33/42] chore: fix invalid condition
---
internal/statesync/reactor.go | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index 6070e3a14f..f72d40682b 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -1061,10 +1061,15 @@ func (r *Reactor) recentSnapshots(ctx context.Context, n uint32) ([]*snapshot, e
break
}
+ if r.csState == nil {
+ continue
+ }
+ currentHeight := r.csState.GetRoundState().Height
// we only accept snapshots where next block is already finalized, that is we are voting
// for `height + 2` or higher, because we need to be able to fetch light block containing
// commit for `height` from block store (which is stored in block `height+1`)
- if s.Height <= uint64(r.csState.GetRoundState().Height)-2 {
+ if int64(s.Height) >= currentHeight-2 {
+ r.logger.Debug("snapshot too new, skipping", "height", s.Height, "state_height", currentHeight)
continue
}
From c22edb60208d54759731b5d6ab3be485c7dfe63d Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 27 Jan 2025 18:46:41 +0100
Subject: [PATCH 34/42] feat(statesync): add state sync retries limit
---
config/config.go | 9 +++++++++
config/toml.go | 4 ++++
internal/statesync/reactor.go | 2 +-
internal/statesync/syncer.go | 5 +++++
internal/statesync/syncer_test.go | 14 +++++++-------
5 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/config/config.go b/config/config.go
index 97ee0f79b0..9cb431b358 100644
--- a/config/config.go
+++ b/config/config.go
@@ -1003,6 +1003,10 @@ type StateSyncConfig struct {
// Time to spend discovering snapshots before initiating a restore.
DiscoveryTime time.Duration `mapstructure:"discovery-time"`
+ // Number of times to retry state sync. When retries are exhausted, the node will
+ // fall back to the regular block sync. Set to 0 to disable retries. Default is 1.
+ Retries int `mapstructure:"retries"`
+
// Temporary directory for state sync snapshot chunks, defaults to os.TempDir().
// The synchronizer will create a new, randomly named directory within this directory
// and remove it when the sync is complete.
@@ -1022,6 +1026,7 @@ func DefaultStateSyncConfig() *StateSyncConfig {
DiscoveryTime: 15 * time.Second,
ChunkRequestTimeout: 15 * time.Second,
Fetchers: 4,
+ Retries: 1,
}
}
@@ -1054,6 +1059,10 @@ func (cfg *StateSyncConfig) ValidateBasic() error {
return errors.New("discovery time must be 0s or greater than five seconds")
}
+ if cfg.Retries < 0 {
+ return errors.New("retries must be greater than or equal to zero")
+ }
+
if cfg.ChunkRequestTimeout < 5*time.Second {
return errors.New("chunk-request-timeout must be at least 5 seconds")
}
diff --git a/config/toml.go b/config/toml.go
index 0f67745bf1..3ba0ed0689 100644
--- a/config/toml.go
+++ b/config/toml.go
@@ -498,6 +498,10 @@ rpc-servers = "{{ StringsJoin .StateSync.RPCServers "," }}"
# Time to spend discovering snapshots before initiating a restore.
discovery-time = "{{ .StateSync.DiscoveryTime }}"
+# Number of times to retry state sync. When retries are exhausted, the node will
+# fall back to the regular block sync. Set to 0 to disable retries. Default is 1.
+retries = {{ .StateSync.Retries }}
+
# Temporary directory for state sync snapshot chunks, defaults to os.TempDir().
# The synchronizer will create a new, randomly named directory within this directory
# and remove it when the sync is complete.
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index f72d40682b..bfd325ce73 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -327,7 +327,7 @@ func (r *Reactor) Sync(ctx context.Context) (sm.State, error) {
}
r.getSyncer().SetStateProvider(r.stateProvider)
- state, commit, err := r.syncer.SyncAny(ctx, r.cfg.DiscoveryTime, r.requestSnaphot)
+ state, commit, err := r.syncer.SyncAny(ctx, r.cfg.DiscoveryTime, r.cfg.Retries, r.requestSnaphot)
if err != nil {
return sm.State{}, fmt.Errorf("sync any: %w", err)
}
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index 665ad5c3e5..0901fd03eb 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -150,6 +150,7 @@ func (s *syncer) RemovePeer(peerID types.NodeID) {
func (s *syncer) SyncAny(
ctx context.Context,
discoveryTime time.Duration,
+ retries int,
requestSnapshots func() error,
) (sm.State, *types.Commit, error) {
if discoveryTime != 0 && discoveryTime < minimumDiscoveryTime {
@@ -170,6 +171,10 @@ func (s *syncer) SyncAny(
for {
iters++
+
+ if retries > 0 && iters > retries {
+ return sm.State{}, nil, errNoSnapshots
+ }
// If not nil, we're going to retry restoration of the same snapshot.
if snapshot == nil {
snapshot = s.snapshots.Best()
diff --git a/internal/statesync/syncer_test.go b/internal/statesync/syncer_test.go
index c811f71590..bd7de2caa3 100644
--- a/internal/statesync/syncer_test.go
+++ b/internal/statesync/syncer_test.go
@@ -277,7 +277,7 @@ func (suite *SyncerTestSuite) TestSyncAny() {
LastBlockAppHash: []byte("app_hash"),
}, nil)
- newState, lastCommit, err := suite.syncer.SyncAny(ctx, 0, func() error { return nil })
+ newState, lastCommit, err := suite.syncer.SyncAny(ctx, 0, 0, func() error { return nil })
suite.Require().NoError(err)
suite.Require().Equal([]int{0: 2, 1: 1, 2: 1, 3: 1}, chunkRequests)
@@ -294,7 +294,7 @@ func (suite *SyncerTestSuite) TestSyncAnyNoSnapshots() {
ctx, cancel := context.WithCancel(suite.ctx)
defer cancel()
- _, _, err := suite.syncer.SyncAny(ctx, 0, func() error { return nil })
+ _, _, err := suite.syncer.SyncAny(ctx, 0, 0, func() error { return nil })
suite.Require().Equal(errNoSnapshots, err)
}
@@ -320,7 +320,7 @@ func (suite *SyncerTestSuite) TestSyncAnyAbort() {
Once().
Return(&abci.ResponseOfferSnapshot{Result: abci.ResponseOfferSnapshot_ABORT}, nil)
- _, _, err = suite.syncer.SyncAny(ctx, 0, func() error { return nil })
+ _, _, err = suite.syncer.SyncAny(ctx, 0, 0, func() error { return nil })
suite.Require().Equal(errAbort, err)
}
@@ -370,7 +370,7 @@ func (suite *SyncerTestSuite) TestSyncAnyReject() {
Once().
Return(&abci.ResponseOfferSnapshot{Result: abci.ResponseOfferSnapshot_REJECT}, nil)
- _, _, err = suite.syncer.SyncAny(ctx, 0, func() error { return nil })
+ _, _, err = suite.syncer.SyncAny(ctx, 0, 0, func() error { return nil })
suite.Require().Equal(errNoSnapshots, err)
}
@@ -413,7 +413,7 @@ func (suite *SyncerTestSuite) TestSyncAnyRejectFormat() {
Once().
Return(&abci.ResponseOfferSnapshot{Result: abci.ResponseOfferSnapshot_ABORT}, nil)
- _, _, err = suite.syncer.SyncAny(ctx, 0, func() error { return nil })
+ _, _, err = suite.syncer.SyncAny(ctx, 0, 0, func() error { return nil })
suite.Require().Equal(errAbort, err)
}
@@ -467,7 +467,7 @@ func (suite *SyncerTestSuite) TestSyncAnyRejectSender() {
Once().
Return(&abci.ResponseOfferSnapshot{Result: abci.ResponseOfferSnapshot_REJECT}, nil)
- _, _, err := suite.syncer.SyncAny(ctx, 0, func() error { return nil })
+ _, _, err := suite.syncer.SyncAny(ctx, 0, 0, func() error { return nil })
suite.Require().Equal(errNoSnapshots, err)
}
@@ -495,7 +495,7 @@ func (suite *SyncerTestSuite) TestSyncAnyAbciError() {
Once().
Return(nil, errBoom)
- _, _, err = suite.syncer.SyncAny(ctx, 0, func() error { return nil })
+ _, _, err = suite.syncer.SyncAny(ctx, 0, 0, func() error { return nil })
suite.Require().True(errors.Is(err, errBoom))
}
From 29fe1333f49bc4ae9383cebdb0808ecb038c7a56 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 27 Jan 2025 19:00:17 +0100
Subject: [PATCH 35/42] chore(statesync): handle no snapshots error
---
internal/statesync/reactor.go | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index bfd325ce73..4cd254305c 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -277,7 +277,11 @@ func (r *Reactor) OnStart(ctx context.Context) error {
if r.needsStateSync {
r.logger.Info("starting state sync")
if _, err := r.Sync(ctx); err != nil {
- r.logger.Error("state sync failed; shutting down this node", "error", err)
+ if errors.Is(err, errNoSnapshots) {
+ r.logger.Warn("no snapshots available; falling back to block sync", "err", err)
+ return nil
+ }
+ r.logger.Error("state sync failed; shutting down this node", "err", err)
return err
}
}
From 9c7f3a00f5c431233c566859ed4b8e387294d1fd Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Tue, 28 Jan 2025 09:52:33 +0100
Subject: [PATCH 36/42] chore: run blocksync on statesync retry failure
---
internal/consensus/state_data.go | 2 +-
internal/statesync/reactor.go | 11 +++++++++--
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/internal/consensus/state_data.go b/internal/consensus/state_data.go
index 0686b0f32d..66b0405711 100644
--- a/internal/consensus/state_data.go
+++ b/internal/consensus/state_data.go
@@ -119,7 +119,7 @@ func (s *StateDataStore) Subscribe(evsw *eventemitter.EventEmitter) {
})
}
-// StateData is a copy of the current RoundState nad state.State stored in the store
+// StateData is a copy of the current RoundState and state.State stored in the store
// Along with data, StateData provides some methods to check or update data inside
type StateData struct {
config *config.ConsensusConfig
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index 4cd254305c..0510af7611 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -277,9 +277,16 @@ func (r *Reactor) OnStart(ctx context.Context) error {
if r.needsStateSync {
r.logger.Info("starting state sync")
if _, err := r.Sync(ctx); err != nil {
- if errors.Is(err, errNoSnapshots) {
+ if errors.Is(err, errNoSnapshots) && r.postSyncHook != nil {
+ state, err := r.stateStore.Load()
+ if err != nil {
+ return fmt.Errorf("failed to load state: %w", err)
+ }
+
r.logger.Warn("no snapshots available; falling back to block sync", "err", err)
- return nil
+ if err := r.postSyncHook(ctx, state); err != nil {
+ return fmt.Errorf("post sync failed: %w", err)
+ }
}
r.logger.Error("state sync failed; shutting down this node", "err", err)
return err
From 589769d90a0eb12283991327ca5c4b9b8cfe4706 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Tue, 28 Jan 2025 10:21:38 +0100
Subject: [PATCH 37/42] chore: fix minor condition
---
internal/statesync/reactor.go | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index 0510af7611..26a4d23cee 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -287,9 +287,10 @@ func (r *Reactor) OnStart(ctx context.Context) error {
if err := r.postSyncHook(ctx, state); err != nil {
return fmt.Errorf("post sync failed: %w", err)
}
+ } else {
+ r.logger.Error("state sync failed; shutting down this node", "err", err)
+ return err
}
- r.logger.Error("state sync failed; shutting down this node", "err", err)
- return err
}
}
From 3370545898414889a8368a05581e1252e54a1ce1 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Tue, 28 Jan 2025 10:57:42 +0100
Subject: [PATCH 38/42] chore: fix logging
---
internal/statesync/reactor.go | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index 26a4d23cee..d526d6bac6 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -278,12 +278,13 @@ func (r *Reactor) OnStart(ctx context.Context) error {
r.logger.Info("starting state sync")
if _, err := r.Sync(ctx); err != nil {
if errors.Is(err, errNoSnapshots) && r.postSyncHook != nil {
+ r.logger.Warn("no snapshots available; falling back to block sync", "err", err)
+
state, err := r.stateStore.Load()
if err != nil {
return fmt.Errorf("failed to load state: %w", err)
}
- r.logger.Warn("no snapshots available; falling back to block sync", "err", err)
if err := r.postSyncHook(ctx, state); err != nil {
return fmt.Errorf("post sync failed: %w", err)
}
From 76f6c00aef0fa40755c2e31a6463983b98166053 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Tue, 28 Jan 2025 11:22:12 +0100
Subject: [PATCH 39/42] fix: invalid condition
---
internal/statesync/syncer.go | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index 0901fd03eb..ec0c4185b1 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -170,11 +170,11 @@ func (s *syncer) SyncAny(
)
for {
- iters++
-
- if retries > 0 && iters > retries {
+ if retries > 0 && snapshot == nil && iters > retries {
return sm.State{}, nil, errNoSnapshots
}
+
+ iters++
// If not nil, we're going to retry restoration of the same snapshot.
if snapshot == nil {
snapshot = s.snapshots.Best()
From 244c246520fd5e335b4443dfdd94b4f737ac3d2f Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 29 Jan 2025 11:02:30 +0100
Subject: [PATCH 40/42] chore(statesync): fix type conversion
---
internal/statesync/reactor.go | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index d526d6bac6..e69c18d5dc 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -22,6 +22,7 @@ import (
sm "github.com/dashpay/tenderdash/internal/state"
"github.com/dashpay/tenderdash/internal/store"
"github.com/dashpay/tenderdash/libs/log"
+ tmmath "github.com/dashpay/tenderdash/libs/math"
"github.com/dashpay/tenderdash/libs/service"
"github.com/dashpay/tenderdash/light/provider"
ssproto "github.com/dashpay/tenderdash/proto/tendermint/statesync"
@@ -1081,7 +1082,7 @@ func (r *Reactor) recentSnapshots(ctx context.Context, n uint32) ([]*snapshot, e
// we only accept snapshots where next block is already finalized, that is we are voting
// for `height + 2` or higher, because we need to be able to fetch light block containing
// commit for `height` from block store (which is stored in block `height+1`)
- if int64(s.Height) >= currentHeight-2 {
+ if tmmath.MustConvertInt64(s.Height) >= currentHeight-2 {
r.logger.Debug("snapshot too new, skipping", "height", s.Height, "state_height", currentHeight)
continue
}
@@ -1100,7 +1101,7 @@ func (r *Reactor) recentSnapshots(ctx context.Context, n uint32) ([]*snapshot, e
// fetchLightBlock works out whether the node has a light block at a particular
// height and if so returns it so it can be gossiped to peers
func (r *Reactor) fetchLightBlock(height uint64) (*types.LightBlock, error) {
- h := int64(height)
+ h := tmmath.MustConvertInt64(height)
blockMeta := r.blockStore.LoadBlockMeta(h)
if blockMeta == nil {
From 45df3f86d7f6a8d62f474412861743572c1f34fa Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 29 Jan 2025 11:03:16 +0100
Subject: [PATCH 41/42] test(types): validator set hash test vectors
---
types/validator_test.go | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/types/validator_test.go b/types/validator_test.go
index 72d9051100..dffadeb12a 100644
--- a/types/validator_test.go
+++ b/types/validator_test.go
@@ -2,12 +2,16 @@ package types
import (
"context"
+ "encoding/base64"
+ "encoding/hex"
+ "fmt"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/dashpay/tenderdash/crypto"
+ "github.com/dashpay/tenderdash/crypto/bls12381"
)
func TestValidatorProtoBuf(t *testing.T) {
@@ -111,3 +115,23 @@ func TestValidatorValidateBasic(t *testing.T) {
})
}
}
+
+func TestValdiatorSetHash(t *testing.T) {
+ thresholdPublicKey, err := base64.RawStdEncoding.DecodeString("gw5F5F5kFNnWFUc8woFOaxccUI+cd+ixaSS3RZT2HJlWpvoWM16YRn6sjYvbdtGH")
+ require.NoError(t, err)
+ fmt.Printf("thresholdPublicKey: %s\n", hex.EncodeToString(thresholdPublicKey))
+
+ quorumHash, err := hex.DecodeString("703ee5bfc78765cc9e151d8dd84e30e196ababa83ac6cbdee31a88a46bba81b9")
+ require.NoError(t, err)
+
+ expected := "81742F95E99EAE96ABC727FE792CECB4996205DE6BFC88AFEE1F60B96BC648B2"
+ // require.NoError(t, err)
+
+ valset := ValidatorSet{
+ ThresholdPublicKey: bls12381.PubKey(thresholdPublicKey),
+ QuorumHash: quorumHash,
+ }
+
+ hash := valset.Hash()
+ assert.Equal(t, expected, hash.String())
+}
From 9d5a5f64764ad43d5a49310b4b91f46ea8b86d38 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 29 Jan 2025 11:55:11 +0100
Subject: [PATCH 42/42] chore(statesync): 3 retries by default
---
config/config.go | 7 +++++--
config/toml.go | 4 +++-
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/config/config.go b/config/config.go
index 9cb431b358..a6e4903fa9 100644
--- a/config/config.go
+++ b/config/config.go
@@ -1004,7 +1004,10 @@ type StateSyncConfig struct {
DiscoveryTime time.Duration `mapstructure:"discovery-time"`
// Number of times to retry state sync. When retries are exhausted, the node will
- // fall back to the regular block sync. Set to 0 to disable retries. Default is 1.
+ // fall back to the regular block sync. Set to 0 to disable retries. Default is 3.
+ //
+ // Note that in pessimistic case, it will take at least `discovery-time * retries` before
+ // falling back to block sync.
Retries int `mapstructure:"retries"`
// Temporary directory for state sync snapshot chunks, defaults to os.TempDir().
@@ -1026,7 +1029,7 @@ func DefaultStateSyncConfig() *StateSyncConfig {
DiscoveryTime: 15 * time.Second,
ChunkRequestTimeout: 15 * time.Second,
Fetchers: 4,
- Retries: 1,
+ Retries: 3,
}
}
diff --git a/config/toml.go b/config/toml.go
index 3ba0ed0689..dddf0ac43f 100644
--- a/config/toml.go
+++ b/config/toml.go
@@ -499,7 +499,9 @@ rpc-servers = "{{ StringsJoin .StateSync.RPCServers "," }}"
discovery-time = "{{ .StateSync.DiscoveryTime }}"
# Number of times to retry state sync. When retries are exhausted, the node will
-# fall back to the regular block sync. Set to 0 to disable retries. Default is 1.
+# fall back to the regular block sync. Set to 0 to disable retries. Default is 3.
+# Note that in pessimistic case, it will take at least (discovery-time * retries) before
+# falling back to block sync.
retries = {{ .StateSync.Retries }}
# Temporary directory for state sync snapshot chunks, defaults to os.TempDir().