diff --git a/eth/filters/trace_api.go b/eth/filters/trace_api.go index 349c8cf5fa05..878bc7ced1d7 100644 --- a/eth/filters/trace_api.go +++ b/eth/filters/trace_api.go @@ -77,34 +77,43 @@ func (api *FilterAPI) NewPendingTransactionsWithTrace(ctx context.Context, trace tracedTxs = make([]*RPCTransaction, 0, len(txs)) blockNumber = hexutil.Big(*header.Number) blockHash = header.Hash() + txIndex = hexutil.Uint64(0) ) statedb, err := api.sys.chain.State() if err != nil { - log.Error("NewPendingTransactionsWithTrace failed to get state", "err", err) + log.Error("failed to get state", "err", err) return } for _, tx := range txs { msg, _ = core.TransactionToMessage(tx, signer, header.BaseFee) if err != nil { - log.Error("NewPendingTransactionsWithTrace failed to create tx message", "err", err, "tx", tx.Hash()) + log.Error("failed to create tx message", "err", err, "tx", tx.Hash()) continue } traceCtx.TxHash = tx.Hash() trace, err := traceTx(msg, traceCtx, blockCtx, chainConfig, statedb, tracerOpts) if err != nil { - log.Error("NewPendingTransactionsWithTrace failed to trace tx", "err", err, "tx", tx.Hash()) + log.Error("failed to trace tx", "err", err, "tx", tx.Hash()) continue } + gasPrice := hexutil.Big(*tx.GasPrice()) rpcTx := newRPCPendingTransaction(tx) rpcTx.BlockHash = &blockHash rpcTx.BlockNumber = &blockNumber + rpcTx.TransactionIndex = &txIndex rpcTx.Trace = trace + rpcTx.GasPrice = &gasPrice tracedTxs = append(tracedTxs, rpcTx) } + + if len(tracedTxs) == 0 { + continue + } + notifier.Notify(rpcSub.ID, tracedTxs) case <-rpcSub.Err(): return diff --git a/eth/tracers/blocknative/blocknative.go b/eth/tracers/blocknative/blocknative.go index 959006b5f72e..cdfaf685fcc2 100644 --- a/eth/tracers/blocknative/blocknative.go +++ b/eth/tracers/blocknative/blocknative.go @@ -2,9 +2,6 @@ package blocknative import ( "encoding/json" - "fmt" - "math/big" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/eth/tracers/blocknative/decoder" @@ -20,6 +17,7 @@ type Tracer interface { // TracerOpts configure the tracer to save or ignore various aspects of a transaction execution. type TracerOpts struct { Logs bool `json:"logs"` + Decode bool `json:"decode"` BalanceChanges bool `json:"balanceChanges"` // DisableBlockContext disables the block context in the trace. @@ -30,10 +28,10 @@ type TracerOpts struct { // Trace contains all the accumulated details of a transaction execution. type Trace struct { CallFrame - BlockContext *BlockContext `json:"blockContext,omitempty"` - Logs []CallLog `json:"logs,omitempty"` - Time string `json:"time,omitempty"` - BalanceChanges NetBalanceChanges `json:"balanceChanges"` + BlockContext *BlockContext `json:"blockContext,omitempty"` + Logs []CallLog `json:"logs,omitempty"` + Time string `json:"time,omitempty"` + BalanceChanges decoder.NetBalanceChanges `json:"balanceChanges"` } // BlockContext contains information about the block we simulate transactions in. @@ -48,17 +46,18 @@ type BlockContext struct { } type CallFrame struct { - Type string `json:"type"` - From string `json:"from"` - To string `json:"to,omitempty"` - Value string `json:"value,omitempty"` - Gas string `json:"gas"` - GasUsed string `json:"gasUsed"` - Input string `json:"input"` - Output string `json:"output,omitempty"` - Error string `json:"error,omitempty"` - ErrorReason string `json:"errorReason,omitempty"` - Calls []CallFrame `json:"calls,omitempty"` + Type string `json:"type"` + From string `json:"from"` + To string `json:"to,omitempty"` + Value string `json:"value,omitempty"` + Gas string `json:"gas"` + GasUsed string `json:"gasUsed"` + Input string `json:"input"` + Output string `json:"output,omitempty"` + Error string `json:"error,omitempty"` + ErrorReason string `json:"errorReason,omitempty"` + Calls []CallFrame `json:"calls,omitempty"` + Decoded *decoder.CallFrame `json:"decoded,omitempty"` } // CallLog represents a single log entry from the receipt of a transaction. @@ -72,65 +71,3 @@ type CallLog struct { // Topics is a slice of up to 4 32byte words provided with the log. Topics []common.Hash `json:"topics"` } - -// NetBalanceChanges is a list of account balance changes. -type NetBalanceChanges []AccountBalanceChanges - -// AccountBalanceChanges is a list of balance changes for a single account. -type AccountBalanceChanges struct { - Address common.Address `json:"address"` - BalanceChanges []BalanceChange `json:"balanceChanges"` -} - -// BalanceChange is a change in an account's balance for a single asset. -type BalanceChange struct { - Delta *Amount `json:"delta"` - Asset *decoder.Asset `json:"asset"` - Breakdown []AssetTransferEvent `json:"breakdown"` -} - -// AssetTransferEvent is a single transfer of an asset. -type AssetTransferEvent struct { - Counterparty common.Address `json:"counterparty"` - Amount *Amount `json:"amount"` -} - -type Amount big.Int - -func NewAmount(i *big.Int) *Amount { - return (*Amount)(i) -} - -func (a *Amount) Add(x *Amount, y *big.Int) { - a.ToInt().Add(x.ToInt(), y) -} - -func (a *Amount) ToInt() *big.Int { - return (*big.Int)(a) -} - -func (a *Amount) String() string { - return a.ToInt().String() -} - -func (a *Amount) MarshalJSON() ([]byte, error) { - return json.Marshal(a.ToInt().String()) -} - -func (a *Amount) UnmarshalJSON(data []byte) error { - if data == nil || len(data) == 0 { - *a = *NewAmount(big.NewInt(0)) - return nil - } - - var s string - if err := json.Unmarshal(data, &s); err != nil { - return err - } - aInt, ok := new(big.Int).SetString(s, 10) - if !ok { - return fmt.Errorf("failed to convert string to Amount") - } - *a = *(*Amount)(aInt) - return nil -} diff --git a/eth/tracers/blocknative/decoder/abi.go b/eth/tracers/blocknative/decoder/abi.go new file mode 100644 index 000000000000..e79c9458d275 --- /dev/null +++ b/eth/tracers/blocknative/decoder/abi.go @@ -0,0 +1,61 @@ +package decoder + +import ( + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/log" +) + +var ( + abiTypes = struct { + _string abi.Type + _address abi.Type + _uint256 abi.Type + _uint256Array abi.Type + _bytes abi.Type + }{} + + abiArgs = struct { + singleString abi.Arguments + batchTransfer abi.Arguments + }{} +) + +func init() { + if err := initABITypes(); err != nil { + log.Error("failed to initialize abi types", "err", err) + } + initABIArgs() +} + +// initABITypes initializes all the abiTypes. +func initABITypes() error { + var err error + if abiTypes._string, err = abi.NewType("string", "", nil); err != nil { + return err + } + if abiTypes._address, err = abi.NewType("address", "", nil); err != nil { + return err + } + if abiTypes._uint256, err = abi.NewType("uint256", "", nil); err != nil { + return err + } + if abiTypes._uint256Array, err = abi.NewType("uint256[]", "", nil); err != nil { + return err + } + if abiTypes._bytes, err = abi.NewType("bytes", "", nil); err != nil { + return err + } + return nil +} + +// initABIArgs initializes all the abiArgs. +func initABIArgs() { + abiArgs.singleString = abi.Arguments{abi.Argument{Type: abiTypes._string, Name: "name"}} + abiArgs.batchTransfer = abi.Arguments{ + abi.Argument{Type: abiTypes._address, Name: "from"}, + abi.Argument{Type: abiTypes._address, Name: "to"}, + abi.Argument{Type: abiTypes._uint256Array, Name: "tokenIDs"}, + abi.Argument{Type: abiTypes._uint256Array, Name: "values"}, + abi.Argument{Type: abiTypes._bytes, Name: "data"}, + } +} diff --git a/eth/tracers/blocknative/decoder/asset.go b/eth/tracers/blocknative/decoder/asset.go new file mode 100644 index 000000000000..c797752b8a0b --- /dev/null +++ b/eth/tracers/blocknative/decoder/asset.go @@ -0,0 +1,209 @@ +package decoder + +import ( + "fmt" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + "math/big" +) + +var ( + ethAddress = common.Address{} + EthAssetID = AssetID{ethAddress, nil} + EthAsset = &Asset{ + AssetID: EthAssetID, + AssetMetadata: &AssetMetadata{ + Type: AssetTypeNative, + Name: "Ether", + Symbol: "ETH", + Decimals: 18, + }, + } +) + +// evmCallFn executes the given method on the code for the given address. +// The result is returned as raw, ABI-encoded bytes. +type evmCallFn func(addr common.Address, method []byte) ([]byte, error) + +// DecodeAsset decodes the metadata for an asset by calling various methods on +// the underlying contract inside the EVM and decoding the results. +func DecodeAsset(evmCall evmCallFn, contract *Contract, assetID AssetID) (*AssetMetadata, error) { + var metadata AssetMetadata + switch { + case contract.IsERC20(): + metadata = decodeERC20Metadata(evmCall, assetID.Address) + case contract.IsERC721(): + metadata = decodeERC721Metadata(evmCall, assetID.Address, assetID.TokenID) + case contract.IsERC1155(): + metadata = decodeERC1155Metadata(evmCall, assetID.Address, assetID.TokenID) + } + return &metadata, nil +} + +// decodeERC20Metadata decodes the metadata for an ERC20 token from the EVM. +func decodeERC20Metadata(evmCall evmCallFn, addr common.Address) AssetMetadata { + var err error + metadata := AssetMetadata{Type: AssetTypeERC20} + + if metadata.Name, err = decodeMetadataName(evmCall, addr); err != nil { + log.Trace("failed to decode ERC20 name", "err", err) + } + if metadata.Symbol, err = decodeMetadataSymbol(evmCall, addr); err != nil { + log.Trace("failed to decode ERC20 symbol", "err", err) + } + if metadata.Decimals, err = decodeMetadataDecimals(evmCall, addr); err != nil { + log.Trace("failed to decode ERC20 decimals", "err", err) + } + + return metadata +} + +// decodeERC721Metadata decodes the metadata for an ERC721 token from the EVM. +func decodeERC721Metadata(evmCall evmCallFn, addr common.Address, tokenID *big.Int) AssetMetadata { + var err error + metadata := AssetMetadata{Type: AssetTypeERC721} + + if metadata.Name, err = decodeMetadataName(evmCall, addr); err != nil { + log.Trace("failed to decode ERC721 name", "err", err) + } + if metadata.Symbol, err = decodeMetadataSymbol(evmCall, addr); err != nil { + log.Trace("failed to decode ERC721 symbol", "err", err) + } + if metadata.URI, err = decodeMetadataTokenURI(evmCall, addr, tokenID); err != nil { + log.Trace("failed to decode ERC721 tokenURI", "err", err) + } + + return metadata +} + +// decodeERC1155Metadata decodes the metadata for an ERC1155 token from the EVM. +func decodeERC1155Metadata(evmCall evmCallFn, addr common.Address, tokenID *big.Int) AssetMetadata { + var err error + metadata := AssetMetadata{Type: AssetTypeERC1155} + + if metadata.URI, err = decodeMetadataURI(evmCall, addr, tokenID); err != nil { + log.Trace("failed to decode ERC1155 URI", "err", err) + } + + return metadata +} + +// decodeMetadataName decodes the name of an asset from the EVM. +func decodeMetadataName(evmCall evmCallFn, addr common.Address) (string, error) { + return callAndDecodeString(evmCall, addr, methodIDName) +} + +// decodeMetadataSymbol decodes the symbol of an asset from the EVM. +func decodeMetadataSymbol(evmCall evmCallFn, addr common.Address) (string, error) { + return callAndDecodeString(evmCall, addr, methodIDSymbol) +} + +// decodeMetadataDecimals decodes the decimals of an asset from the EVM. +func decodeMetadataDecimals(evmCall evmCallFn, addr common.Address) (uint8, error) { + return callAndDecodeUint8(evmCall, addr, methodIDDecimals) +} + +// decodeMetadataTokenURI decodes the tokenURI of an asset from the EVM. +func decodeMetadataTokenURI(evmCall evmCallFn, addr common.Address, tokenID *big.Int) (string, error) { + tokenIDBytes := tokenID.Bytes() + if len(tokenIDBytes) > 32 { + return "", fmt.Errorf("tokenID is too large") + } + common.LeftPadBytes(tokenIDBytes, 32) + input := append(methodIDTokenURI, tokenIDBytes...) + return callAndDecodeString(evmCall, addr, input) +} + +// decodeMetadataURI decodes the URI of an asset from the EVM. +func decodeMetadataURI(evmCall evmCallFn, addr common.Address, tokenID *big.Int) (string, error) { + tokenIDBytes := tokenID.Bytes() + if len(tokenIDBytes) > 32 { + return "", fmt.Errorf("tokenID is too large") + } + common.LeftPadBytes(tokenIDBytes, 32) + input := append(methodIDURI, tokenIDBytes...) + return callAndDecodeString(evmCall, addr, input) +} + +// callAndDecodeString calls a method and decodes the result as a string. +func callAndDecodeString(evmCall evmCallFn, addr common.Address, method []byte) (string, error) { + // Load bytes from the EVM. + stringBytes, err := evmCall(addr, method) + if err != nil { + return "", err + } + + // Parse into a string. + stringInterface, err := abiArgs.singleString.Unpack(stringBytes) + if err != nil { + return "", err + } + if len(stringInterface) < len(abiArgs.singleString) { + return "", fmt.Errorf("unexpected decoded size") + } + str, ok := stringInterface[0].(string) + if !ok { + return "", fmt.Errorf("unexpected type for decoded string") + } + + return str, nil +} + +// callAndDecodeUint8 calls a method and decodes the result as a uint8. +func callAndDecodeUint8(evmCall evmCallFn, addr common.Address, method []byte) (uint8, error) { + // Load bytes from the EVM. + uint8Bytes, err := evmCall(addr, method) + if err != nil { + return 0, err + } + + // Parse into a uint8. + if len(uint8Bytes) < 1 { + return 0, fmt.Errorf("unexpected decoded size") + } + return uint8Bytes[len(uint8Bytes)-1], nil +} + +// decodeArgsSafeBatchTransferFrom calls a method and decodes the result as a uint256[]. +func decodeArgsSafeBatchTransferFrom(bytes []byte) ([]*Transfer, error) { + args, err := abiArgs.batchTransfer.UnpackValues(bytes) + if err != nil { + return nil, err + } + if len(args) < len(abiArgs.batchTransfer) { + return nil, fmt.Errorf("unexpected decoded size") + } + + from, ok := args[0].(common.Address) + if !ok { + return nil, fmt.Errorf("unexpected type for decoded address") + } + to, ok := args[1].(common.Address) + if !ok { + return nil, fmt.Errorf("unexpected type for decoded address") + } + tokenIDs, ok := args[2].([]*big.Int) + if !ok { + return nil, fmt.Errorf("unexpected type for decoded uint265[]") + } + values, ok := args[3].([]*big.Int) + if !ok { + return nil, fmt.Errorf("unexpected type for decoded uint265[]") + } + + if len(tokenIDs) != len(values) { + return nil, fmt.Errorf("expected matching array lengths") + } + + transfers := make([]*Transfer, len(tokenIDs)) + for i := 0; i < len(tokenIDs); i++ { + transfers[i] = &Transfer{ + From: from, + To: to, + Value: NewAmount(values[i]), + TokenID: tokenIDs[i], + } + } + + return transfers, nil +} diff --git a/eth/tracers/blocknative/decoder/asset_types.go b/eth/tracers/blocknative/decoder/asset_types.go index ab1626d5e308..489154c09d8c 100644 --- a/eth/tracers/blocknative/decoder/asset_types.go +++ b/eth/tracers/blocknative/decoder/asset_types.go @@ -2,24 +2,9 @@ package decoder import ( "encoding/json" - "github.com/ethereum/go-ethereum/common" - "math/big" "strings" ) -type Asset struct { - Address common.Address `json:"address,omitempty"` - Type AssetType `json:"type"` - TokenID *big.Int `json:"TokenID,omitempty"` - TokenMetadata -} - -type TokenMetadata struct { - Name string `json:"name"` - Symbol string `json:"symbol"` - Decimals uint8 `json:"decimals,omitempty"` -} - const ( AssetTypeUnknown AssetType = iota AssetTypeNative @@ -28,7 +13,7 @@ const ( AssetTypeERC1155 ) -type AssetType int +type AssetType uint8 func (t AssetType) String() string { switch t { @@ -38,6 +23,8 @@ func (t AssetType) String() string { return "erc20" case AssetTypeERC721: return "erc721" + case AssetTypeERC1155: + return "erc1155" case AssetTypeUnknown: return "unknown" default: @@ -61,6 +48,8 @@ func (t *AssetType) UnmarshalJSON(data []byte) error { *t = AssetTypeERC20 case "erc721": *t = AssetTypeERC721 + case "erc1155": + *t = AssetTypeERC1155 default: *t = AssetTypeUnknown } @@ -68,7 +57,9 @@ func (t *AssetType) UnmarshalJSON(data []byte) error { } // AssetTypeForInterfaces returns the asset type for the given interfaces. -func AssetTypeForInterfaces(interfaces []InterfaceType) AssetType { +// A contract can implement multiple interfaces, so we check them in the order +// of precedence and take the first. +func AssetTypeForInterfaces(interfaces []Interface) AssetType { for _, i := range interfaces { switch i { case interfaceTypeERC1155: diff --git a/eth/tracers/blocknative/balance_changes.go b/eth/tracers/blocknative/decoder/balances.go similarity index 51% rename from eth/tracers/blocknative/balance_changes.go rename to eth/tracers/blocknative/decoder/balances.go index 94d41dc64584..09e9907d9447 100644 --- a/eth/tracers/blocknative/balance_changes.go +++ b/eth/tracers/blocknative/decoder/balances.go @@ -1,45 +1,43 @@ -package blocknative +package decoder import ( "math/big" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/eth/tracers/blocknative/decoder" - "github.com/ethereum/go-ethereum/log" ) // balanceTracker represents the difference of value (ETH, erc20, erc721) after the transaction for all addresses. -type balanceTracker struct { - stateDB stateDB - assetGetter assetGetter +type balances struct { balanceChanges balanceChangeByOwnerByAsset } // newBalanceChangeTracker creates a new balanceTracker. -func newBalanceChangeTracker(stateDB stateDB, assetGetter assetGetter) *balanceTracker { - return &balanceTracker{ - stateDB: stateDB, - assetGetter: assetGetter, +func newBalances() *balances { + return &balances{ balanceChanges: make(balanceChangeByOwnerByAsset, 4), } } // captureCall decodes potential balance change data out of calldata. -func (bt *balanceTracker) captureCall(sender common.Address, contract common.Address, value *big.Int, input []byte) { +func (bt *balances) captureCall(sender common.Address, receiver common.Address, value *Amount, decoded *CallFrame) { // Add the native transfer. - bt.balanceChanges.addAssetTransfer(bt, sender, contract, decoder.EthAssetID, value) + if value.ToInt().Sign() > 0 { + bt.balanceChanges.addAssetTransfer(EthAsset, sender, receiver, value) + } - // Decode the call data and if it's a transfer then add it. - decodedCall := decoder.DecodeCalldata(sender, input) - if decodedCall == nil || decodedCall.CallType != decoder.AssetTransfer { + if decoded == nil { return } - asset := decoder.AssetID{Address: contract, TokenID: decodedCall.TokenID} - bt.balanceChanges.addAssetTransfer(bt, decodedCall.From, decodedCall.To, asset, decodedCall.Value) + + // Add any decoded transfers. + for _, transfer := range decoded.Transfers { + // Add the decoded transfer now. + bt.balanceChanges.addAssetTransfer(transfer.Asset, transfer.From, transfer.To, transfer.Value) + } } // captureGas adds the gas payments to the balance changes. -func (bt *balanceTracker) captureGas(origin common.Address, coinbase common.Address, gasUsed uint64, gasFee *big.Int, gasBaseFee *big.Int) { +func (bt *balances) captureGas(origin common.Address, coinbase common.Address, gasUsed uint64, gasFee *big.Int, gasBaseFee *big.Int) { gasUsedBig := new(big.Int).SetUint64(gasUsed) // Calculate the gas cost for the base fee. @@ -51,14 +49,14 @@ func (bt *balanceTracker) captureGas(origin common.Address, coinbase common.Addr gasCostTip.Mul(gasCostTip, gasUsedBig) // Add the gas tip as a two-way transfer between origin and coinbase. - bt.balanceChanges.accountAssetChange(bt, origin, common.Address{}, decoder.EthAssetID, gasCostBase) + bt.balanceChanges.accountAssetChange(origin, common.Address{}, EthAsset, NewAmount(gasCostBase)) // Add the base fee as a one-way transfer from origin to empty address. - bt.balanceChanges.addAssetTransfer(bt, origin, coinbase, decoder.EthAssetID, gasCostTip) + bt.balanceChanges.addAssetTransfer(EthAsset, origin, coinbase, NewAmount(gasCostTip)) } // formatNetBalanceChanges aggregates the balanceChanges into a NetBalanceChanges. -func (bt *balanceTracker) formatNetBalanceChanges() NetBalanceChanges { +func (bt *balances) formatNetBalanceChanges() NetBalanceChanges { // Turn the balanceChanges map into a list of [{addr, [{token, change}]}] netBalanceChanges := make(NetBalanceChanges, 0, len(bt.balanceChanges)) for addr, changes := range bt.balanceChanges { @@ -71,22 +69,20 @@ func (bt *balanceTracker) formatNetBalanceChanges() NetBalanceChanges { return netBalanceChanges } -// stateDB is an interface that provides access to account balances. -type stateDB interface { - GetBalance(common.Address) *big.Int -} - -// assetGetter is a function that returns the metadata for a given asset address. -type assetGetter func(decoder.AssetID) (*decoder.Asset, error) - // balanceChangeByAsset is a map of asset address to BalanceChange. -type balanceChangeByAsset map[decoder.AssetID]BalanceChange +type balanceChangeByAsset map[AssetID]BalanceChange // balanceChangeByOwnerByAsset is a map of owner address to balanceChangeByAsset. type balanceChangeByOwnerByAsset map[common.Address]balanceChangeByAsset +// addAssetTransfer adds a double-sided asset transfer to the balanceChangeByOwnerByAsset map. +func (changeMap balanceChangeByOwnerByAsset) addAssetTransfer(asset *Asset, from, to common.Address, value *Amount) { + changeMap.accountAssetChange(to, from, asset, value) + changeMap.accountAssetChange(from, to, asset, value.Neg()) +} + // accountAssetChange adds a single side change of an asset transfer to the balanceChangeByOwnerByAsset map. -func (changeMap balanceChangeByOwnerByAsset) accountAssetChange(bt *balanceTracker, owner common.Address, counterparty common.Address, assetID decoder.AssetID, delta *big.Int) { +func (changeMap balanceChangeByOwnerByAsset) accountAssetChange(owner common.Address, counterparty common.Address, asset *Asset, delta *Amount) { // If this is the first time we've seen this owner then create a new // balanceByAsset map. if _, ok := changeMap[owner]; !ok { @@ -95,35 +91,41 @@ func (changeMap balanceChangeByOwnerByAsset) accountAssetChange(bt *balanceTrack // If this is the first time we've seen this asset for this owner then // create a new BalanceChange, including loading the asset metadata. - if _, ok := changeMap[owner][assetID]; !ok { - asset, err := bt.assetGetter(assetID) - if err != nil { - log.Trace("failed to read token metadata", "err", err) - } - changeMap[owner][assetID] = BalanceChange{ + if _, ok := changeMap[owner][asset.AssetID]; !ok { + changeMap[owner][asset.AssetID] = BalanceChange{ Delta: NewAmount(big.NewInt(0)), Asset: asset, } } // Update the delta and add a breakdown event. - ownerBalanceChange := changeMap[owner][assetID] + ownerBalanceChange := changeMap[owner][asset.AssetID] ownerBalanceChange.Delta.Add(ownerBalanceChange.Delta, delta) ownerBalanceChange.Breakdown = append(ownerBalanceChange.Breakdown, AssetTransferEvent{ Counterparty: counterparty, - Amount: NewAmount(delta), + Amount: delta, }) - changeMap[owner][assetID] = ownerBalanceChange + changeMap[owner][asset.AssetID] = ownerBalanceChange +} + +// NetBalanceChanges is a list of account balance changes. +type NetBalanceChanges []AccountBalanceChanges +// AccountBalanceChanges is a list of balance changes for a single account. +type AccountBalanceChanges struct { + Address common.Address `json:"address"` + BalanceChanges []BalanceChange `json:"balanceChanges"` } -// addAssetTransfer adds a double-sided asset transfer to the balanceChangeByOwnerByAsset map. -func (changeMap balanceChangeByOwnerByAsset) addAssetTransfer(bt *balanceTracker, from common.Address, to common.Address, assetID decoder.AssetID, value *big.Int) { - if value == nil || value.Sign() == 0 { - return - } +// BalanceChange is a change in an account's balance for a single asset. +type BalanceChange struct { + Delta *Amount `json:"delta"` + Asset *Asset `json:"asset"` + Breakdown []AssetTransferEvent `json:"breakdown"` +} - changeMap.accountAssetChange(bt, to, from, assetID, value) - negValue := new(big.Int).Neg(value) - changeMap.accountAssetChange(bt, from, to, assetID, negValue) +// AssetTransferEvent is a single transfer of an asset. +type AssetTransferEvent struct { + Counterparty common.Address `json:"counterparty"` + Amount *Amount `json:"amount"` } diff --git a/eth/tracers/blocknative/decoder/bytecode.go b/eth/tracers/blocknative/decoder/bytecode.go deleted file mode 100644 index ef5d1d61b4ac..000000000000 --- a/eth/tracers/blocknative/decoder/bytecode.go +++ /dev/null @@ -1,65 +0,0 @@ -package decoder - -import "bytes" - -type Bytecode []byte - -// ContainsMethods returns true if all given methodIDs are found in the code. -func (b Bytecode) ContainsMethods(methodIDs ...[]byte) bool { - for _, methodID := range methodIDs { - firstNonZeroIndex := 0 - for firstNonZeroIndex < len(methodID) && methodID[firstNonZeroIndex] == 0 { - firstNonZeroIndex++ - } - - if !bytes.Contains(b, methodID[firstNonZeroIndex:]) { - return false - } - } - return true -} - -// IsMetadataBasic returns true iff the bytecode implements basic metadata. -func (b Bytecode) IsBasicMetadata() bool { - return b.ContainsMethods(methodIDsBasicMetadata...) -} - -// IsERC20 returns true iff the bytecode implements ERC20. -func (b Bytecode) IsERC20() bool { - return b.ContainsMethods(methodIDsERC20All...) -} - -// IsERC721 returns true iff the bytecode implements ERC721. -func (b Bytecode) IsERC721() bool { - return b.ContainsMethods(methodIDsERC721All...) -} - -// IsERC1155 returns true iff the bytecode implements ERC1155. -func (b Bytecode) IsERC1155() bool { - return b.ContainsMethods(methodIDsERC1155All...) -} - -// DecodeInterface determines the first interface implemented by a contract. -func (b Bytecode) DecodeInterface() InterfaceType { - interfaces := b.DecodeInterfaces() - if len(interfaces) == 0 { - return interfaceTypeUnknown - } - return interfaces[0] -} - -// DecodeInterfaces determines all interfaces implemented by a contract. -func (b Bytecode) DecodeInterfaces() []InterfaceType { - var interfaces []InterfaceType - - if b.IsERC20() { - interfaces = append(interfaces, interfaceTypeERC20) - } - if b.IsERC721() { - interfaces = append(interfaces, interfaceTypeERC721) - } - if b.IsERC1155() { - interfaces = append(interfaces, interfaceTypeERC1155) - } - return interfaces -} diff --git a/eth/tracers/blocknative/decoder/cache.go b/eth/tracers/blocknative/decoder/cache.go new file mode 100644 index 000000000000..34155f883f47 --- /dev/null +++ b/eth/tracers/blocknative/decoder/cache.go @@ -0,0 +1,23 @@ +package decoder + +import ( + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/lru" +) + +const ( + cacheSizeContracts = 10_0000 + cacheSizeAssets = 10_0000 +) + +type Caches struct { + contracts *lru.Cache[common.Address, *Contract] + assets *lru.Cache[AssetID, *AssetMetadata] +} + +func NewCaches() *Caches { + return &Caches{ + contracts: lru.NewCache[common.Address, *Contract](cacheSizeContracts), + assets: lru.NewCache[AssetID, *AssetMetadata](cacheSizeAssets), + } +} diff --git a/eth/tracers/blocknative/decoder/calldata.go b/eth/tracers/blocknative/decoder/calldata.go index 7691012fd349..016b4048a587 100644 --- a/eth/tracers/blocknative/decoder/calldata.go +++ b/eth/tracers/blocknative/decoder/calldata.go @@ -1,41 +1,34 @@ package decoder import ( - "bytes" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" "math/big" ) -const ( - CallTypeUnknown CallType = iota - AssetTransfer -) - -type CallType int +func decodeCallData(sender common.Address, contract *Contract, input []byte) (*CallData, error) { + // Check if the input is capable of being a function call. + // If not then we're done. If so then check if it's a transfer. + inputLen := len(input) + switch { + case inputLen < 4: + return nil, ErrCallDataTooShort + } -type DecodedCall struct { - CallType CallType - From common.Address - To common.Address - Value *big.Int + methodBytes := make([]byte, 4) + copy(methodBytes, input[:4]) - TokenID *big.Int -} + var ( + idx = 4 + method = MethodID(methodBytes) + args = make([]string, 0, 4) -func DecodeCalldata(sender common.Address, input []byte) *DecodedCall { - // Check if the input is capable of being a function call selector. - // If not then we're done. If so then check if it's a transfer call. - if len(input) < 4 { - return nil - } + from common.Address + to common.Address + amount = new(Amount) + tokenID *big.Int - var ( - idx = 4 - methodID = input[:idx] - from common.Address - to common.Address - amount = new(big.Int) - tokenID *big.Int + transfers []*Transfer ) // scanWord gets the next 32 bytes and advances the index @@ -47,60 +40,91 @@ func DecodeCalldata(sender common.Address, input []byte) *DecodedCall { switch { - // transfer(address,uint256) call. - // payload is [to, amount] - case bytes.Compare(methodID, methodIDTransfer) == 0: + // transfer(address,uint256). + case method.Is(methodIDTransfer): if len(input) < 68 { - return nil + return nil, ErrCallDataTooShort } - from = sender to = common.BytesToAddress(scanWord()) amount.SetBytes(scanWord()) - // transferFrom(address,address,uint256) call. - // safeTransferFrom(address,address,uint256) call. - // safeTransferFrom(address,address,uint256,bytes) call. - // - // payload is [from, to, amount] - case bytes.Compare(methodID, methodIDTransferFrom) == 0: + args = append(args, to.String(), amount.String()) + transfers = append(transfers, &Transfer{ + From: from, + To: to, + Value: amount, + }) + + // transferFrom(address,address,uint256). + case method.Is(methodIDTransferFrom): fallthrough - case bytes.Compare(methodID, methodIDSafeTransferFrom) == 0: + // safeTransferFrom(address,address,uint256). + case method.Is(methodIDSafeTransferFrom): fallthrough - case bytes.Compare(methodID, methodIDSafeTransferFrom2) == 0: + // safeTransferFrom(address,address,uint256,bytes). + case method.Is(methodIDSafeTransferFrom2): if len(input) < 100 { - return nil + return nil, ErrCallDataTooShort } from = common.BytesToAddress(scanWord()) to = common.BytesToAddress(scanWord()) amount.SetBytes(scanWord()) - // ERC1155 style transfers - // + args = append(args, from.String(), to.String(), amount.String()) + + // If the contract is an ERC-721, but not an ERC-20, then move the + // scanned amount to the tokenID and set the amount to 1. + if contract.IsERC721() && !contract.IsERC20() { + tokenID = (*big.Int)(amount) + amount = NewAmount(common.Big1) + } + + transfers = append(transfers, &Transfer{ + From: from, + To: to, + Value: amount, + TokenID: tokenID, + }) + // safeTransferFrom(address,address,uint256,uint256,bytes) - // - // payload is [from, to, tokenID, amount] - case bytes.Compare(methodID, methodIDSafeTransferFrom3) == 0: + case method.Is(methodIDSafeTransferFrom3): if len(input) < 100 { - return nil + return nil, ErrCallDataTooShort } - from = common.BytesToAddress(scanWord()) to = common.BytesToAddress(scanWord()) tokenID = new(big.Int).SetBytes(scanWord()) amount.SetBytes(scanWord()) - // Not a matching event; ignore + args = append(args, from.String(), to.String(), tokenID.String(), amount.String()) + + transfers = append(transfers, &Transfer{ + From: from, + To: to, + Value: amount, + TokenID: tokenID, + }) + + // safeBatchTransferFrom(address,address,uint256[],uint256[],bytes) + case method.Is(methodIDSafeBatchTransferFrom): + var err error + transfers, err = decodeArgsSafeBatchTransferFrom(input[idx:]) + if err != nil { + return nil, err + } default: - return nil + // We don't have a known method so we can't parse the args. + // Just add them as hex-encoded words. + for idx < len(input) { + args = append(args, hexutil.Encode(scanWord())) + } } - return &DecodedCall{ - CallType: AssetTransfer, - From: from, - To: to, - Value: amount, - TokenID: tokenID, - } + return &CallData{ + MethodID: method, + Args: args, + Transfers: transfers, + }, nil } diff --git a/eth/tracers/blocknative/decoder/calldata_test.go b/eth/tracers/blocknative/decoder/calldata_test.go index aa410ad8849d..8f9ae5fae339 100644 --- a/eth/tracers/blocknative/decoder/calldata_test.go +++ b/eth/tracers/blocknative/decoder/calldata_test.go @@ -1,41 +1,150 @@ package decoder import ( - "github.com/ethereum/go-ethereum/common" + "encoding/hex" + "encoding/json" "math/big" - "reflect" "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" ) +type decodeCallDataTest struct { + name string + args decodeCallDataTestArgs + want *CallData +} + +type decodeCallDataTestArgs struct { + sender common.Address + input string + contract *Contract +} + func TestDecodeCalldata(t *testing.T) { - type args struct { - sender common.Address - input []byte - } - tests := []struct { - name string - args args - want *DecodedCall - }{ - { - "erc721", - args{ - common.Address{}, - []byte{35, 184, 114, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 112, 197, 166, 252, 231, 68, 122, 253, 44, 155, 227, 160, 242, 94, 54, 44, 9, 54, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 158, 224, 54, 58, 122, 194, 239, 52, 203, 167, 238, 130, 210, 194, 224, 101, 45, 70, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 197}, - }, - &DecodedCall{ - CallType: AssetTransfer, - From: common.HexToAddress("0x5470c5a6Fce7447aFd2C9BE3A0F25e362C093661"), - To: common.HexToAddress("0x479ee0363a7Ac2ef34cba7ee82D2C2E0652D4669"), - Value: big.NewInt(6341), - TokenID: nil, - }}, - } + tests := getTestCases() for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := DecodeCalldata(tt.args.sender, tt.args.input); !reflect.DeepEqual(got, tt.want) { - t.Errorf("DecodeCalldata() = %v, want %v", got, tt.want) - } + executeTests(t, tt) }) } } + +func BenchmarkDecodeCalldata(B *testing.B) { + tests := getTestCases() + for i := 0; i < B.N; i++ { + executeTests(B, tests[i%len(tests)]) + } +} + +func getTestCases() []decodeCallDataTest { + return []decodeCallDataTest{ + { + "erc20 transferFrom(address,address,uint256)", + decodeCallDataTestArgs{ + common.Address{}, + "23b872dd0000000000000000000000005470c5a6fce7447afd2c9be3a0f25e362c093661000000000000000000000000479ee0363a7ac2ef34cba7ee82d2c2e0652d466900000000000000000000000000000000000000000000000000000000000018c5", + &Contract{interfaces: []Interface{interfaceTypeERC20}}, + }, + &CallData{ + MethodID: methodIDTransferFrom, + Args: []string{"0x5470c5a6Fce7447aFd2C9BE3A0F25e362C093661", "0x479ee0363a7Ac2ef34cba7ee82D2C2E0652D4669", "6341"}, + Transfers: []*Transfer{{ + From: common.HexToAddress("0x5470c5a6Fce7447aFd2C9BE3A0F25e362C093661"), + To: common.HexToAddress("0x479ee0363a7Ac2ef34cba7ee82D2C2E0652D4669"), + Value: NewAmount(big.NewInt(6341)), + TokenID: nil, + }}, + }, + }, + { + "erc721 transferFrom(address,address,uint256)", + decodeCallDataTestArgs{ + common.Address{}, + "23b872dd0000000000000000000000005470c5a6fce7447afd2c9be3a0f25e362c093661000000000000000000000000479ee0363a7ac2ef34cba7ee82d2c2e0652d466900000000000000000000000000000000000000000000000000000000000018c5", + &Contract{interfaces: []Interface{interfaceTypeERC721}}, + }, + &CallData{ + MethodID: methodIDTransferFrom, + Args: []string{"0x5470c5a6Fce7447aFd2C9BE3A0F25e362C093661", "0x479ee0363a7Ac2ef34cba7ee82D2C2E0652D4669", "6341"}, + Transfers: []*Transfer{{ + From: common.HexToAddress("0x5470c5a6Fce7447aFd2C9BE3A0F25e362C093661"), + To: common.HexToAddress("0x479ee0363a7Ac2ef34cba7ee82D2C2E0652D4669"), + Value: NewAmount(common.Big1), + TokenID: big.NewInt(6341), + }}, + }, + }, + { + "erc20+erc721 transferFrom(address,address,uint256)", + decodeCallDataTestArgs{ + common.Address{}, + "23b872dd0000000000000000000000005470c5a6fce7447afd2c9be3a0f25e362c093661000000000000000000000000479ee0363a7ac2ef34cba7ee82d2c2e0652d466900000000000000000000000000000000000000000000000000000000000018c5", + &Contract{interfaces: []Interface{interfaceTypeERC20, interfaceTypeERC721}}, + }, + &CallData{ + MethodID: methodIDTransferFrom, + Args: []string{"0x5470c5a6Fce7447aFd2C9BE3A0F25e362C093661", "0x479ee0363a7Ac2ef34cba7ee82D2C2E0652D4669", "6341"}, + Transfers: []*Transfer{{ + From: common.HexToAddress("0x5470c5a6fce7447afd2c9be3a0f25e362c093661"), + To: common.HexToAddress("0x479ee0363a7Ac2ef34cba7ee82D2C2E0652D4669"), + Value: NewAmount(big.NewInt(6341)), + TokenID: nil, + }}, + }, + }, + { + "erc1155 safeTransferFrom(address,address,uint256,uint256,bytes)", + decodeCallDataTestArgs{ + common.Address{}, + "f242432a000000000000000000000000cb89354a1c6e7abd1972a68466db238e48a3b0c800000000000000000000000020964f741d2dffd2ccec658ca086e21af1d7df8e000000000000000000000000000000000000000000000000000000000000001d000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000360c6ebe", + &Contract{interfaces: []Interface{interfaceTypeERC20, interfaceTypeERC721}}, + }, + &CallData{ + MethodID: methodIDSafeTransferFrom3, + Args: []string{"0xcb89354a1c6e7ABd1972a68466Db238e48a3B0C8", "0x20964f741d2dfFD2cCec658CA086e21aF1D7dF8E", "29", "1"}, + Transfers: []*Transfer{{ + From: common.HexToAddress("0xcb89354a1c6e7ABd1972a68466Db238e48a3B0C8"), + To: common.HexToAddress("0x20964f741d2dffd2ccec658ca086e21af1d7df8e"), + Value: NewAmount(common.Big1), + TokenID: big.NewInt(29), + }}, + }, + }, + { + "erc1155 safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)", + decodeCallDataTestArgs{ + common.Address{}, + "2eb2c2d6000000000000000000000000381e840f4ebe33d0153e9a312105554594a98c42000000000000000000000000a2b876dbb382d40cecee2acc670f55ad95c4767e00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000006ed00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000", + &Contract{interfaces: []Interface{interfaceTypeERC20, interfaceTypeERC721}}, + }, + &CallData{ + MethodID: methodIDSafeBatchTransferFrom, + Transfers: []*Transfer{{ + From: common.HexToAddress("0x381E840F4eBe33d0153e9A312105554594A98C42"), + To: common.HexToAddress("0xA2b876dbb382d40cECeE2ACC670f55AD95c4767e"), + TokenID: parseBigInt("603320636550823895720563178976525038911488"), + Value: NewAmount(common.Big1), + }}, + }, + }, + } +} + +func executeTests(t testing.TB, tt decodeCallDataTest) { + input, err := hex.DecodeString(tt.args.input) + require.NoError(t, err) + + got, err := decodeCallData(tt.args.sender, tt.args.contract, input) + require.NoError(t, err) + + gotJSON, _ := json.Marshal(got) + wantJSON, _ := json.Marshal(tt.want) + require.Equal(t, string(gotJSON), string(wantJSON)) +} + +func parseBigInt(s string) *big.Int { + b, _ := new(big.Int).SetString(s, 10) + return b +} diff --git a/eth/tracers/blocknative/decoder/contract.go b/eth/tracers/blocknative/decoder/contract.go new file mode 100644 index 000000000000..cd967c5a45df --- /dev/null +++ b/eth/tracers/blocknative/decoder/contract.go @@ -0,0 +1,90 @@ +package decoder + +import ( + "bytes" + "golang.org/x/exp/slices" +) + +// decodeContract decodes the contract bytecode and determines all interfaces +func decodeContract(bytecode ByteCode) (*Contract, error) { + + interfaces := bytecode.DecodeInterfaces() + + return &Contract{ + interfaces: interfaces, + Type: contractTypeForInterfaces(interfaces), + }, nil +} + +// IsERC20 returns true iff the contract interfaces contains ERC-20. +func (c *Contract) IsERC20() bool { + return slices.Contains(c.interfaces, interfaceTypeERC20) +} + +// IsERC721 returns true iff the contract interfaces contains ERC-721. +func (c *Contract) IsERC721() bool { + return slices.Contains(c.interfaces, interfaceTypeERC721) +} + +// IsERC1155 returns true iff the contract interfaces contains ERC-1155. +func (c *Contract) IsERC1155() bool { + return slices.Contains(c.interfaces, interfaceTypeERC1155) +} + +type ByteCode []byte + +func containsMethod(b ByteCode, id MethodID) bool { + if id[0] == 0 { + id = id[1:] + } + if id[0] == 0 { + id = id[1:] + } + + if !bytes.Contains(b, id) { + return false + } + + return true +} + +// containsAllMethods returns true iff all ids are found in the ByteCode. +func containsAllMethods(b ByteCode, ids ...MethodID) bool { + for _, id := range ids { + if !containsMethod(b, id) { + return false + } + } + return true +} + +// DecodeInterfaces determines all interfaces implemented by a contract. +func (b ByteCode) DecodeInterfaces() []Interface { + var interfaces []Interface + + if containsAllMethods(b, interfaceMethodsERC20...) { + interfaces = append(interfaces, interfaceTypeERC20) + } + if containsAllMethods(b, interfaceMethodsERC721...) { + interfaces = append(interfaces, interfaceTypeERC721) + } + if containsAllMethods(b, interfaceMethodsERC1155...) { + interfaces = append(interfaces, interfaceTypeERC1155) + } + return interfaces +} + +func contractTypeForInterfaces(interfaces []Interface) ContractType { + for _, i := range interfaces { + + switch i { + case interfaceTypeERC1155: + return ContractTypeERC1155 + case interfaceTypeERC721: + return ContractTypeERC721 + case interfaceTypeERC20: + return ContractTypeERC20 + } + } + return ContractTypeUnknown +} diff --git a/eth/tracers/blocknative/decoder/decoder.go b/eth/tracers/blocknative/decoder/decoder.go new file mode 100644 index 000000000000..c0f0e26488dd --- /dev/null +++ b/eth/tracers/blocknative/decoder/decoder.go @@ -0,0 +1,139 @@ +package decoder + +import ( + "errors" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + "math/big" +) + +var ( + ErrAccountNotAContract = errors.New("account is not a contract") + ErrCallDataTooShort = errors.New("call data too short") + ErrCallDataNotFullWords = errors.New("call data not full words") +) + +type Decoder struct { + caches *Caches + evm evm + balances *balances +} + +func New(caches *Caches, evm evm) *Decoder { + return &Decoder{ + caches: caches, + evm: evm, + balances: newBalances(), + } +} + +// DecodeCallFrame decodes the given call frame into its method and arguments. +// If the call frame is determined to represent one or more Asset transfers we +// add those too. +func (d *Decoder) DecodeCallFrame(sender common.Address, receiver common.Address, value *big.Int, input []byte) (*CallFrame, error) { + contract, err := d.DecodeContract(receiver) + if err != nil { + return nil, err + } + + callData, err := decodeCallData(sender, contract, input) + if err != nil { + return nil, err + } + + // Add decoded Assets to any transfers. + for _, transfer := range callData.Transfers { + // Always add the assetID. + assetID := AssetID{Address: receiver, TokenID: transfer.TokenID} + transfer.Asset = &Asset{AssetID: assetID} + + // Add metadata if we can decode it but don't fail if we can't. + assetMetadata, err := d.decodeAsset(contract, assetID) + if err != nil { + log.Trace("failed to decode asset", "err", err) + continue + } + transfer.Asset.AssetMetadata = assetMetadata + } + + cf := &CallFrame{Contract: contract, CallData: callData} + + d.balances.captureCall(sender, receiver, NewAmount(value), cf) + + return cf, nil +} + +// DecodeContract decodes the contract at the given address. +func (d *Decoder) DecodeContract(addr common.Address) (*Contract, error) { + // Check the cache for an existing entry. + contract, ok := d.caches.contracts.Get(addr) + if ok { + if contract == nil { + return nil, ErrAccountNotAContract + } + return contract, nil + } + + // Cache miss; First check if the account has code. If it doesn't we cache + // a nil to avoid hitting the stateDB repeatedly for accounts that don't + // have code. + bytecode := ByteCode(d.evm.GetCode(addr)) + if len(bytecode) == 0 { + d.caches.contracts.Add(addr, nil) + return nil, ErrAccountNotAContract + } + + // We have an unknown contract; decode itm, add it to the cache, and return it. + contract, err := decodeContract(bytecode) + if err != nil { + return nil, err + } + d.caches.contracts.Add(addr, contract) + return contract, nil +} + +// GetBalanceChanges returns the net balance changes for the currently decoded +// call-frames. +func (d *Decoder) GetBalanceChanges() NetBalanceChanges { + return d.balances.formatNetBalanceChanges() +} + +// CaptureGas is a hack to expose the captureGas method to the tracer. +// Ideally this would happen internally but requires the tracer to cal +// DecodeCallFrame in CaptureEnd/CaptureExit instead of Start/Enter. +func (d *Decoder) CaptureGas(origin common.Address, coinbase common.Address, gasUsed uint64, gasFee *big.Int, gasBaseFee *big.Int) { + d.balances.captureGas(origin, coinbase, gasUsed, gasFee, gasBaseFee) +} + +// decodeAsset finds the metadata for the given assetID. It heuristically uses +// information from the decoded contract when possible. +// Results are cached. +func (d *Decoder) decodeAsset(contract *Contract, assetID AssetID) (*AssetMetadata, error) { + // Check for native ETH and skip the cache check entire. + if assetID.Address == ethAddress { + return EthAsset.AssetMetadata, nil + } + + // Check the cache for an existing entry. + asset, ok := d.caches.assets.Get(assetID) + if ok { + return asset, nil + } + + // Cache miss; decode and add to the cache. + + asset, err := DecodeAsset(d.evm.CallCode, contract, assetID) + if err != nil { + return nil, err + } + + d.caches.assets.Add(assetID, asset) + + return asset, nil +} + +// evm is the functionality we need from the EVM to decode. +type evm interface { + GetCode(common.Address) []byte + CallCode(common.Address, []byte) ([]byte, error) +} diff --git a/eth/tracers/blocknative/decoder/interfaces_types.go b/eth/tracers/blocknative/decoder/interfaces.go similarity index 74% rename from eth/tracers/blocknative/decoder/interfaces_types.go rename to eth/tracers/blocknative/decoder/interfaces.go index 22372fff6b1f..deed7779b902 100644 --- a/eth/tracers/blocknative/decoder/interfaces_types.go +++ b/eth/tracers/blocknative/decoder/interfaces.go @@ -6,15 +6,15 @@ import ( ) const ( - interfaceTypeUnknown InterfaceType = iota + interfaceTypeUnknown Interface = iota interfaceTypeERC20 interfaceTypeERC721 interfaceTypeERC1155 ) -type InterfaceType int +type Interface uint8 -func (t InterfaceType) String() string { +func (t Interface) String() string { switch t { case interfaceTypeERC20: return "erc20" @@ -27,11 +27,11 @@ func (t InterfaceType) String() string { } } -func (t InterfaceType) MarshalJSON() ([]byte, error) { +func (t Interface) MarshalJSON() ([]byte, error) { return json.Marshal(t.String()) } -func (t *InterfaceType) UnmarshalJSON(data []byte) error { +func (t *Interface) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err diff --git a/eth/tracers/blocknative/decoder/metadata.go b/eth/tracers/blocknative/decoder/metadata.go deleted file mode 100644 index 4ea11bee15cf..000000000000 --- a/eth/tracers/blocknative/decoder/metadata.go +++ /dev/null @@ -1,188 +0,0 @@ -package decoder - -import ( - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/lru" - "github.com/ethereum/go-ethereum/common/math" - "github.com/ethereum/go-ethereum/core/vm" - "github.com/ethereum/go-ethereum/log" -) - -const ( - cacheSize = 10_0000 -) - -var ( - abiStringType abi.Type - abiSingleStringArgs abi.Arguments - - ethAddress = common.Address{} - EthAssetID = AssetID{ethAddress, nil} - ethAsset = &Asset{ - Address: ethAddress, - Type: AssetTypeNative, - TokenMetadata: TokenMetadata{ - Name: "Ether", - Symbol: "ETH", - Decimals: 18, - }, - } -) - -func init() { - var err error - abiStringType, err = abi.NewType("string", "", nil) - if err != nil { - log.Error("failed to create abi string type", "err", err) - } - - abiSingleStringArgs = abi.Arguments{abi.Argument{Type: abiStringType, Name: "name"}} -} - -type AssetID struct { - Address common.Address - TokenID *big.Int -} - -type AssetDecoder struct { - cache lru.BasicLRU[AssetID, *Asset] -} - -func NewAssetDecoder() *AssetDecoder { - return &AssetDecoder{ - cache: lru.NewBasicLRU[AssetID, *Asset](cacheSize), - } -} - -func (d *AssetDecoder) Decode(evm *vm.EVM, assetID AssetID) (*Asset, error) { - if assetID.Address == ethAddress { - return ethAsset, nil - } - - // Check the cache for an existing entry. - if asset, ok := d.cache.Get(assetID); ok { - return asset, nil - } - - // Cache miss; decode from EVM and add to the cache. - asset, err := d.decode(evm, assetID) - if err != nil { - return nil, err - } - d.cache.Add(assetID, asset) - - return asset, nil -} - -func (d *AssetDecoder) decode(evm *vm.EVM, assetID AssetID) (*Asset, error) { - bytecode := Bytecode(evm.StateDB.GetCode(assetID.Address)) - - asset := &Asset{ - Address: assetID.Address, - Type: AssetTypeForInterfaces(bytecode.DecodeInterfaces()), - TokenID: assetID.TokenID, - } - - var err error - - switch asset.Type { - case AssetTypeERC20: - asset.TokenMetadata, err = d.decodeERC20Metadata(evm, assetID.Address) - if err != nil { - return asset, err - } - case AssetTypeERC721: - fallthrough - case AssetTypeERC1155: - if bytecode.IsBasicMetadata() { - asset.TokenMetadata, err = d.decodeBasicMetadata(evm, assetID.Address) - if err != nil { - return asset, err - } - } - } - - return asset, nil -} - -// decodeERC20Metadata decodes the metadata for an ERC20 token from the EVM. -func (d *AssetDecoder) decodeERC20Metadata(evm *vm.EVM, contract common.Address) (TokenMetadata, error) { - metadata, err := d.decodeBasicMetadata(evm, contract) - if err != nil { - return TokenMetadata{}, err - } - - decimals, err := d.decodeMetadataUint8(evm, contract, methodIDDecimals) - if err != nil { - return TokenMetadata{}, err - } - - metadata.Decimals = decimals - return metadata, nil -} - -func (d *AssetDecoder) decodeBasicMetadata(evm *vm.EVM, contract common.Address) (TokenMetadata, error) { - name, err := d.decodeMetadataString(evm, contract, methodIDName) - if err != nil { - return TokenMetadata{}, err - } - - symbol, err := d.decodeMetadataString(evm, contract, methodIDSymbol) - if err != nil { - return TokenMetadata{}, err - } - - return TokenMetadata{ - Name: name, - Symbol: symbol, - }, nil -} - -func (d *AssetDecoder) decodeMetadataString(evm *vm.EVM, contract common.Address, method []byte) (string, error) { - // Load bytes from the EVM. - stringBytes, err := callEVMMethod(evm, contract, method) - if err != nil { - return "", err - } - - // Parse into a string. - stringInterface, err := abiSingleStringArgs.Unpack(stringBytes) - if err != nil { - return "", err - } - if len(stringInterface) < 1 { - return "", fmt.Errorf("unexpected decoded size") - } - name, ok := stringInterface[0].(string) - if !ok { - return "", fmt.Errorf("unexpected type for decoded string") - } - - return name, nil -} - -func (d *AssetDecoder) decodeMetadataUint8(evm *vm.EVM, contract common.Address, method []byte) (uint8, error) { - // Load bytes from the EVM. - uint8Bytes, err := callEVMMethod(evm, contract, method) - if err != nil { - return 0, err - } - - // Parse into a uint8. - if len(uint8Bytes) < 1 { - return 0, fmt.Errorf("unexpected decoded size") - } - return uint8Bytes[len(uint8Bytes)-1], nil -} - -func callEVMMethod(evm *vm.EVM, contract common.Address, method []byte) ([]byte, error) { - ret, _, err := evm.Call(vm.AccountRef(contract), contract, method, math.MaxUint64, common.Big0) - if err != nil { - return nil, err - } - return ret, nil -} diff --git a/eth/tracers/blocknative/decoder/method_ids.go b/eth/tracers/blocknative/decoder/method_ids.go deleted file mode 100644 index 935998240d9c..000000000000 --- a/eth/tracers/blocknative/decoder/method_ids.go +++ /dev/null @@ -1,46 +0,0 @@ -package decoder - -var ( - // ERC20 - methodIDName = methodIDToBytes(0x06fdde03) // name() - methodIDSymbol = methodIDToBytes(0x95d89b41) // symbol() - methodIDDecimals = methodIDToBytes(0x313ce567) // decimals() - - methodIDTransfer = methodIDToBytes(0xa9059cbb) // transfer(address,uint256) - methodIDTransferFrom = methodIDToBytes(0x23b872dd) // transferFrom(address,address,uint256) - methodIDTotalSupply = methodIDToBytes(0x18160ddd) // totalSupply() - methodIDBalanceOf = methodIDToBytes(0x70a08231) // balanceOf(address) - methodIDApprove = methodIDToBytes(0x095ea7b3) // approve(address,uint256) - methodIDAllowance = methodIDToBytes(0xdd62ed3e) // allowance(address,address) - - // ERC721 - methodIDSafeTransferFrom = methodIDToBytes(0x42842e0e) // safeTransferFrom(address,address,uint256) - methodIDSafeTransferFrom2 = methodIDToBytes(0xb88d4fde) // safeTransferFrom(address,address,uint256,bytes) - methodIDOwnerOf = methodIDToBytes(0x6352211e) // ownerOf(uint256) - methodIDSetApprovalForAll = methodIDToBytes(0xa22cb465) // setApprovalForAll(address,bool) - methodIDGetApproved = methodIDToBytes(0x081812fc) // getApproved(uint256) - methodIDIsApprovedForAll = methodIDToBytes(0xe985e9c5) // isApprovedForAll(address,address) - - // ERC1155 - methodIDBalanceOf2 = methodIDToBytes(0x00fdd58e) // balanceOf(address,uint256) - methodIDBalanceOfBatch = methodIDToBytes(0x4e1273f4) // balanceOfBatch(address[],uint256[]) - methodIDSafeTransferFrom3 = methodIDToBytes(0xf242432a) // safeTransferFrom(address,address,uint256,uint256,bytes) - methodIDSafeBatchTransferFrom = methodIDToBytes(0x2eb2c2d6) // safeBatchTransferFrom(address,address,uint256[],uint256[],bytes) - - // Interfaces by list of methodIDs - methodIDsERC20All = [][]byte{methodIDName, methodIDSymbol, methodIDDecimals, methodIDTransfer, methodIDTransferFrom, methodIDTotalSupply, methodIDBalanceOf, methodIDApprove, methodIDAllowance} - methodIDsERC721All = [][]byte{methodIDBalanceOf, methodIDOwnerOf, methodIDSafeTransferFrom, methodIDSafeTransferFrom2, methodIDTransferFrom, methodIDApprove, methodIDSetApprovalForAll, methodIDGetApproved, methodIDIsApprovedForAll} - methodIDsERC1155All = [][]byte{methodIDSafeTransferFrom3, methodIDSafeBatchTransferFrom, methodIDBalanceOf2, methodIDBalanceOfBatch, methodIDSetApprovalForAll, methodIDIsApprovedForAll} - methodIDsBasicMetadata = [][]byte{methodIDName, methodIDSymbol} -) - -// methodIDToBytes converts a uint32 methodID to slice of up 4 bytes. -// Leading zero bytes are omitted because contracts can/do safely omit them. -func methodIDToBytes(i uint32) []byte { - return []byte{ - byte(i >> 24), - byte(i >> 16), - byte(i >> 8), - byte(i), - } -} diff --git a/eth/tracers/blocknative/decoder/methods.go b/eth/tracers/blocknative/decoder/methods.go new file mode 100644 index 000000000000..5d0c8bd7d1e1 --- /dev/null +++ b/eth/tracers/blocknative/decoder/methods.go @@ -0,0 +1,113 @@ +package decoder + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "fmt" + "github.com/ethereum/go-ethereum/common" +) + +const ( + methodIDLen = 4 + methodIDEncodedLen = methodIDLen * 2 +) + +var ( + ErrMethodIDTooLong = fmt.Errorf("methodID is too long") + + // ERC20 + methodIDTransfer = methodIDToBytes(0xa9059cbb) // transfer(address,uint256) + methodIDTransferFrom = methodIDToBytes(0x23b872dd) // transferFrom(address,address,uint256) + methodIDTotalSupply = methodIDToBytes(0x18160ddd) // totalSupply() + methodIDBalanceOf = methodIDToBytes(0x70a08231) // balanceOf(address) + methodIDApprove = methodIDToBytes(0x095ea7b3) // approve(address,uint256) + methodIDAllowance = methodIDToBytes(0xdd62ed3e) // allowance(address,address) + + // ERC721 + methodIDSafeTransferFrom = methodIDToBytes(0x42842e0e) // safeTransferFrom(address,address,uint256) + methodIDSafeTransferFrom2 = methodIDToBytes(0xb88d4fde) // safeTransferFrom(address,address,uint256,bytes) + methodIDOwnerOf = methodIDToBytes(0x6352211e) // ownerOf(uint256) + methodIDSetApprovalForAll = methodIDToBytes(0xa22cb465) // setApprovalForAll(address,bool) + methodIDGetApproved = methodIDToBytes(0x081812fc) // getApproved(uint256) + methodIDIsApprovedForAll = methodIDToBytes(0xe985e9c5) // isApprovedForAll(address,address) + + // ERC1155 + methodIDBalanceOf2 = methodIDToBytes(0x00fdd58e) // balanceOf(address,uint256) + methodIDBalanceOfBatch = methodIDToBytes(0x4e1273f4) // balanceOfBatch(address[],uint256[]) + methodIDSafeTransferFrom3 = methodIDToBytes(0xf242432a) // safeTransferFrom(address,address,uint256,uint256,bytes) + methodIDSafeBatchTransferFrom = methodIDToBytes(0x2eb2c2d6) // safeBatchTransferFrom(address,address,uint256[],uint256[],bytes) + + // Metadata + methodIDName = methodIDToBytes(0x06fdde03) // name() + methodIDSymbol = methodIDToBytes(0x95d89b41) // symbol() + methodIDDecimals = methodIDToBytes(0x313ce567) // decimals() + methodIDTokenURI = methodIDToBytes(0xc87b56dd) // tokenURI(uint256) + methodIDURI = methodIDToBytes(0x0e89341c) // uri(uint256) + + // Interfaces by list of methodIDs + interfaceMethodsERC20 = []MethodID{methodIDName, methodIDSymbol, methodIDDecimals, methodIDTransfer, methodIDTransferFrom, methodIDTotalSupply, methodIDBalanceOf, methodIDApprove, methodIDAllowance} + interfaceMethodsERC721 = []MethodID{methodIDBalanceOf, methodIDOwnerOf, methodIDSafeTransferFrom, methodIDSafeTransferFrom2, methodIDTransferFrom, methodIDApprove, methodIDSetApprovalForAll, methodIDGetApproved, methodIDIsApprovedForAll} + interfaceMethodsERC1155 = []MethodID{methodIDSafeTransferFrom3, methodIDSafeBatchTransferFrom, methodIDBalanceOf2, methodIDBalanceOfBatch, methodIDSetApprovalForAll, methodIDIsApprovedForAll} +) + +type MethodID []byte + +func (m MethodID) Is(other MethodID) bool { + return bytes.Compare(m, other) == 0 +} + +func (m MethodID) String() string { + return "0x" + hex.EncodeToString(m) +} + +func (m MethodID) MarshalJSON() ([]byte, error) { + return json.Marshal(m.String()) +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +// The bytes come as ASCII-encoded hex, quoted and with a 0x prefix. +func (m *MethodID) UnmarshalJSON(b []byte) error { + // Remove quotes and 0x prefix, and ensure the remainder isn't too long. + if len(b) > 2 { + if b[0] == '"' && b[len(b)-1] == '"' { + b = b[1 : len(b)-1] + } + } + if len(b) > 2 { + if b[0] == '0' && (b[1] == 'x' || b[1] == 'X') { + b = b[2:] + } + } + + if len(b) > methodIDEncodedLen { + fmt.Println("sdfasdfasdf:", len(b), string(b), b) + return ErrMethodIDTooLong + } + + // Decode hex into m. + methodIDBytes := make([]byte, 4) + if _, err := hex.Decode(methodIDBytes, b); err != nil { + panic(err) + return err + } + + // Method IDs with leading zero bytes are sometimes expressed externally + // with fewer than 4 bytes. We pad them here to ensure they are always the + // right length internally. + common.LeftPadBytes(methodIDBytes, 0) + + *m = methodIDBytes + return nil +} + +// methodIDToBytes converts a uint32 methodID to slice of up 4 bytes. +// Leading zero bytes are omitted because contracts can/do safely omit them. +func methodIDToBytes(i uint32) MethodID { + return MethodID{ + byte(i >> 24), + byte(i >> 16), + byte(i >> 8), + byte(i), + } +} diff --git a/eth/tracers/blocknative/decoder/method_ids_test.go b/eth/tracers/blocknative/decoder/methods_test.go similarity index 99% rename from eth/tracers/blocknative/decoder/method_ids_test.go rename to eth/tracers/blocknative/decoder/methods_test.go index e94a5906a422..a8be3e5e342f 100644 --- a/eth/tracers/blocknative/decoder/method_ids_test.go +++ b/eth/tracers/blocknative/decoder/methods_test.go @@ -8,28 +8,25 @@ import ( func TestBytecodeDecodeInterfaces(t *testing.T) { tests := []struct { - bytecode Bytecode - expected []InterfaceType + bytecode ByteCode + expected []Interface }{ - {testERC20ContractBytecode, []InterfaceType{interfaceTypeERC20}}, - {testERC721ContractBytecode, []InterfaceType{interfaceTypeERC721}}, - {testERC1155ContractBytecode, []InterfaceType{interfaceTypeERC1155}}, - {testERC1155RealWorldBytecode, []InterfaceType{interfaceTypeERC1155}}, + {testERC20ContractBytecode, []Interface{interfaceTypeERC20}}, + {testERC721ContractBytecode, []Interface{interfaceTypeERC721}}, + {testERC1155ContractBytecode, []Interface{interfaceTypeERC1155}}, + {testERC1155RealWorldBytecode, []Interface{interfaceTypeERC1155}}, } for _, test := range tests { interfaces := test.bytecode.DecodeInterfaces() require.Equal(t, test.expected, interfaces) - - singleInterface := test.bytecode.DecodeInterface() - require.Equal(t, test.expected[0], singleInterface) } } var ( - testERC20ContractBytecode = Bytecode([]byte{96, 128, 96, 64, 82, 52, 128, 21, 97, 0, 15, 87, 95, 128, 253, 91, 80, 96, 4, 54, 16, 97, 0, 145, 87, 95, 53, 96, 224, 28, 128, 99, 49, 60, 229, 103, 17, 97, 0, 100, 87, 128, 99, 49, 60, 229, 103, 20, 97, 1, 49, 87, 128, 99, 112, 160, 130, 49, 20, 97, 1, 79, 87, 128, 99, 149, 216, 155, 65, 20, 97, 1, 127, 87, 128, 99, 169, 5, 156, 187, 20, 97, 1, 157, 87, 128, 99, 221, 98, 237, 62, 20, 97, 1, 205, 87, 97, 0, 145, 86, 91, 128, 99, 6, 253, 222, 3, 20, 97, 0, 149, 87, 128, 99, 9, 94, 167, 179, 20, 97, 0, 179, 87, 128, 99, 24, 22, 13, 221, 20, 97, 0, 227, 87, 128, 99, 35, 184, 114, 221, 20, 97, 1, 1, 87, 91, 95, 128, 253, 91, 97, 0, 157, 97, 1, 253, 86, 91, 96, 64, 81, 97, 0, 170, 145, 144, 97, 3, 48, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 0, 205, 96, 4, 128, 54, 3, 129, 1, 144, 97, 0, 200, 145, 144, 97, 3, 225, 86, 91, 97, 2, 58, 86, 91, 96, 64, 81, 97, 0, 218, 145, 144, 97, 4, 57, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 0, 235, 97, 2, 65, 86, 91, 96, 64, 81, 97, 0, 248, 145, 144, 97, 4, 97, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 27, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 22, 145, 144, 97, 4, 122, 86, 91, 97, 2, 69, 86, 91, 96, 64, 81, 97, 1, 40, 145, 144, 97, 4, 57, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 57, 97, 2, 77, 86, 91, 96, 64, 81, 97, 1, 70, 145, 144, 97, 4, 229, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 105, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 100, 145, 144, 97, 4, 254, 86, 91, 97, 2, 85, 86, 91, 96, 64, 81, 97, 1, 118, 145, 144, 97, 4, 97, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 135, 97, 2, 91, 86, 91, 96, 64, 81, 97, 1, 148, 145, 144, 97, 3, 48, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 183, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 178, 145, 144, 97, 3, 225, 86, 91, 97, 2, 152, 86, 91, 96, 64, 81, 97, 1, 196, 145, 144, 97, 4, 57, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 231, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 226, 145, 144, 97, 5, 41, 86, 91, 97, 2, 159, 86, 91, 96, 64, 81, 97, 1, 244, 145, 144, 97, 4, 97, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 96, 96, 96, 64, 81, 128, 96, 64, 1, 96, 64, 82, 128, 96, 16, 129, 82, 96, 32, 1, 127, 84, 101, 115, 116, 32, 69, 82, 67, 50, 48, 32, 84, 111, 107, 101, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 80, 144, 80, 144, 86, 91, 95, 146, 145, 80, 80, 86, 91, 95, 144, 86, 91, 95, 147, 146, 80, 80, 80, 86, 91, 95, 96, 18, 144, 80, 144, 86, 91, 95, 145, 144, 80, 86, 91, 96, 96, 96, 64, 81, 128, 96, 64, 1, 96, 64, 82, 128, 96, 3, 129, 82, 96, 32, 1, 127, 84, 69, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 80, 144, 80, 144, 86, 91, 95, 146, 145, 80, 80, 86, 91, 95, 146, 145, 80, 80, 86, 91, 95, 129, 81, 144, 80, 145, 144, 80, 86, 91, 95, 130, 130, 82, 96, 32, 130, 1, 144, 80, 146, 145, 80, 80, 86, 91, 95, 91, 131, 129, 16, 21, 97, 2, 221, 87, 128, 130, 1, 81, 129, 132, 1, 82, 96, 32, 129, 1, 144, 80, 97, 2, 194, 86, 91, 95, 132, 132, 1, 82, 80, 80, 80, 80, 86, 91, 95, 96, 31, 25, 96, 31, 131, 1, 22, 144, 80, 145, 144, 80, 86, 91, 95, 97, 3, 2, 130, 97, 2, 166, 86, 91, 97, 3, 12, 129, 133, 97, 2, 176, 86, 91, 147, 80, 97, 3, 28, 129, 133, 96, 32, 134, 1, 97, 2, 192, 86, 91, 97, 3, 37, 129, 97, 2, 232, 86, 91, 132, 1, 145, 80, 80, 146, 145, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 3, 72, 129, 132, 97, 2, 248, 86, 91, 144, 80, 146, 145, 80, 80, 86, 91, 95, 128, 253, 91, 95, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 130, 22, 144, 80, 145, 144, 80, 86, 91, 95, 97, 3, 125, 130, 97, 3, 84, 86, 91, 144, 80, 145, 144, 80, 86, 91, 97, 3, 141, 129, 97, 3, 115, 86, 91, 129, 20, 97, 3, 151, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 3, 168, 129, 97, 3, 132, 86, 91, 146, 145, 80, 80, 86, 91, 95, 129, 144, 80, 145, 144, 80, 86, 91, 97, 3, 192, 129, 97, 3, 174, 86, 91, 129, 20, 97, 3, 202, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 3, 219, 129, 97, 3, 183, 86, 91, 146, 145, 80, 80, 86, 91, 95, 128, 96, 64, 131, 133, 3, 18, 21, 97, 3, 247, 87, 97, 3, 246, 97, 3, 80, 86, 91, 91, 95, 97, 4, 4, 133, 130, 134, 1, 97, 3, 154, 86, 91, 146, 80, 80, 96, 32, 97, 4, 21, 133, 130, 134, 1, 97, 3, 205, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 91, 95, 129, 21, 21, 144, 80, 145, 144, 80, 86, 91, 97, 4, 51, 129, 97, 4, 31, 86, 91, 130, 82, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 97, 4, 76, 95, 131, 1, 132, 97, 4, 42, 86, 91, 146, 145, 80, 80, 86, 91, 97, 4, 91, 129, 97, 3, 174, 86, 91, 130, 82, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 97, 4, 116, 95, 131, 1, 132, 97, 4, 82, 86, 91, 146, 145, 80, 80, 86, 91, 95, 128, 95, 96, 96, 132, 134, 3, 18, 21, 97, 4, 145, 87, 97, 4, 144, 97, 3, 80, 86, 91, 91, 95, 97, 4, 158, 134, 130, 135, 1, 97, 3, 154, 86, 91, 147, 80, 80, 96, 32, 97, 4, 175, 134, 130, 135, 1, 97, 3, 154, 86, 91, 146, 80, 80, 96, 64, 97, 4, 192, 134, 130, 135, 1, 97, 3, 205, 86, 91, 145, 80, 80, 146, 80, 146, 80, 146, 86, 91, 95, 96, 255, 130, 22, 144, 80, 145, 144, 80, 86, 91, 97, 4, 223, 129, 97, 4, 202, 86, 91, 130, 82, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 97, 4, 248, 95, 131, 1, 132, 97, 4, 214, 86, 91, 146, 145, 80, 80, 86, 91, 95, 96, 32, 130, 132, 3, 18, 21, 97, 5, 19, 87, 97, 5, 18, 97, 3, 80, 86, 91, 91, 95, 97, 5, 32, 132, 130, 133, 1, 97, 3, 154, 86, 91, 145, 80, 80, 146, 145, 80, 80, 86, 91, 95, 128, 96, 64, 131, 133, 3, 18, 21, 97, 5, 63, 87, 97, 5, 62, 97, 3, 80, 86, 91, 91, 95, 97, 5, 76, 133, 130, 134, 1, 97, 3, 154, 86, 91, 146, 80, 80, 96, 32, 97, 5, 93, 133, 130, 134, 1, 97, 3, 154, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 254, 162, 100, 105, 112, 102, 115, 88, 34, 18, 32, 72, 111, 79, 210, 211, 6, 225, 165, 48, 231, 52, 251, 88, 109, 115, 207, 52, 76, 165, 40, 78, 234, 53, 186, 174, 133, 170, 150, 196, 225, 9, 80, 100, 115, 111, 108, 99, 67, 0, 8, 21, 0, 51}) - testERC721ContractBytecode = Bytecode([]byte{96, 128, 96, 64, 82, 52, 128, 21, 97, 0, 15, 87, 95, 128, 253, 91, 80, 96, 4, 54, 16, 97, 0, 205, 87, 95, 53, 96, 224, 28, 128, 99, 99, 82, 33, 30, 17, 97, 0, 138, 87, 128, 99, 162, 44, 180, 101, 17, 97, 0, 100, 87, 128, 99, 162, 44, 180, 101, 20, 97, 2, 33, 87, 128, 99, 184, 141, 79, 222, 20, 97, 2, 61, 87, 128, 99, 200, 123, 86, 221, 20, 97, 2, 89, 87, 128, 99, 233, 133, 233, 197, 20, 97, 2, 137, 87, 97, 0, 205, 86, 91, 128, 99, 99, 82, 33, 30, 20, 97, 1, 163, 87, 128, 99, 112, 160, 130, 49, 20, 97, 1, 211, 87, 128, 99, 149, 216, 155, 65, 20, 97, 2, 3, 87, 97, 0, 205, 86, 91, 128, 99, 1, 255, 201, 167, 20, 97, 0, 209, 87, 128, 99, 6, 253, 222, 3, 20, 97, 1, 1, 87, 128, 99, 8, 24, 18, 252, 20, 97, 1, 31, 87, 128, 99, 9, 94, 167, 179, 20, 97, 1, 79, 87, 128, 99, 35, 184, 114, 221, 20, 97, 1, 107, 87, 128, 99, 66, 132, 46, 14, 20, 97, 1, 135, 87, 91, 95, 128, 253, 91, 97, 0, 235, 96, 4, 128, 54, 3, 129, 1, 144, 97, 0, 230, 145, 144, 97, 17, 177, 86, 91, 97, 2, 185, 86, 91, 96, 64, 81, 97, 0, 248, 145, 144, 97, 17, 246, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 9, 97, 3, 138, 86, 91, 96, 64, 81, 97, 1, 22, 145, 144, 97, 18, 153, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 57, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 52, 145, 144, 97, 18, 236, 86, 91, 97, 3, 199, 86, 91, 96, 64, 81, 97, 1, 70, 145, 144, 97, 19, 86, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 105, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 100, 145, 144, 97, 19, 153, 86, 91, 97, 4, 157, 86, 91, 0, 91, 97, 1, 133, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 128, 145, 144, 97, 19, 215, 86, 91, 97, 6, 121, 86, 91, 0, 91, 97, 1, 161, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 156, 145, 144, 97, 19, 215, 86, 91, 97, 9, 83, 86, 91, 0, 91, 97, 1, 189, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 184, 145, 144, 97, 18, 236, 86, 91, 97, 10, 135, 86, 91, 96, 64, 81, 97, 1, 202, 145, 144, 97, 19, 86, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 237, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 232, 145, 144, 97, 20, 39, 86, 91, 97, 11, 45, 86, 91, 96, 64, 81, 97, 1, 250, 145, 144, 97, 20, 97, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 2, 11, 97, 11, 225, 86, 91, 96, 64, 81, 97, 2, 24, 145, 144, 97, 18, 153, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 2, 59, 96, 4, 128, 54, 3, 129, 1, 144, 97, 2, 54, 145, 144, 97, 20, 164, 86, 91, 97, 12, 30, 86, 91, 0, 91, 97, 2, 87, 96, 4, 128, 54, 3, 129, 1, 144, 97, 2, 82, 145, 144, 97, 21, 67, 86, 91, 97, 13, 22, 86, 91, 0, 91, 97, 2, 115, 96, 4, 128, 54, 3, 129, 1, 144, 97, 2, 110, 145, 144, 97, 18, 236, 86, 91, 97, 14, 80, 86, 91, 96, 64, 81, 97, 2, 128, 145, 144, 97, 18, 153, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 2, 163, 96, 4, 128, 54, 3, 129, 1, 144, 97, 2, 158, 145, 144, 97, 21, 199, 86, 91, 97, 14, 129, 86, 91, 96, 64, 81, 97, 2, 176, 145, 144, 97, 17, 246, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 95, 127, 128, 172, 88, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 130, 123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 20, 128, 97, 3, 131, 87, 80, 127, 1, 255, 201, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 130, 123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 20, 91, 144, 80, 145, 144, 80, 86, 91, 96, 96, 96, 64, 81, 128, 96, 64, 1, 96, 64, 82, 128, 96, 11, 129, 82, 96, 32, 1, 127, 84, 101, 115, 116, 32, 69, 82, 67, 55, 50, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 80, 144, 80, 144, 86, 91, 95, 128, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 95, 128, 132, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 144, 84, 144, 97, 1, 0, 10, 144, 4, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 3, 97, 4, 101, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 4, 92, 144, 97, 22, 79, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 96, 2, 95, 131, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 144, 84, 144, 97, 1, 0, 10, 144, 4, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 144, 80, 145, 144, 80, 86, 91, 95, 128, 95, 131, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 144, 84, 144, 97, 1, 0, 10, 144, 4, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 144, 80, 128, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 51, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 20, 128, 97, 5, 139, 87, 80, 96, 3, 95, 130, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 51, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 144, 84, 144, 97, 1, 0, 10, 144, 4, 96, 255, 22, 91, 97, 5, 202, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 5, 193, 144, 97, 22, 183, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 130, 96, 2, 95, 132, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 97, 1, 0, 10, 129, 84, 129, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2, 25, 22, 144, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 2, 23, 144, 85, 80, 129, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 130, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 127, 140, 91, 225, 229, 235, 236, 125, 91, 209, 79, 113, 66, 125, 30, 132, 243, 221, 3, 20, 192, 247, 178, 41, 30, 91, 32, 10, 200, 199, 195, 185, 37, 96, 64, 81, 96, 64, 81, 128, 145, 3, 144, 164, 80, 80, 80, 86, 91, 95, 128, 130, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 144, 84, 144, 97, 1, 0, 10, 144, 4, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 20, 97, 7, 22, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 7, 13, 144, 97, 23, 31, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 95, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 130, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 3, 97, 7, 132, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 7, 123, 144, 97, 23, 135, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 97, 7, 143, 131, 51, 131, 97, 14, 171, 86, 91, 97, 7, 206, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 7, 197, 144, 97, 22, 183, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 96, 1, 95, 132, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 129, 84, 128, 146, 145, 144, 97, 8, 27, 144, 97, 23, 210, 86, 91, 145, 144, 80, 85, 80, 96, 1, 95, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 129, 84, 128, 146, 145, 144, 97, 8, 109, 144, 97, 23, 249, 86, 91, 145, 144, 80, 85, 80, 129, 95, 128, 131, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 97, 1, 0, 10, 129, 84, 129, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2, 25, 22, 144, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 2, 23, 144, 85, 80, 96, 2, 95, 130, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 97, 1, 0, 10, 129, 84, 144, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2, 25, 22, 144, 85, 128, 130, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 132, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 127, 221, 242, 82, 173, 27, 226, 200, 155, 105, 194, 176, 104, 252, 55, 141, 170, 149, 43, 167, 241, 99, 196, 161, 22, 40, 245, 90, 77, 245, 35, 179, 239, 96, 64, 81, 96, 64, 81, 128, 145, 3, 144, 164, 80, 80, 80, 86, 91, 97, 9, 94, 131, 131, 131, 97, 6, 121, 86, 91, 95, 130, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 59, 20, 128, 97, 10, 67, 87, 80, 99, 21, 11, 122, 2, 96, 224, 27, 123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 130, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 99, 21, 11, 122, 2, 51, 134, 133, 96, 64, 81, 132, 99, 255, 255, 255, 255, 22, 96, 224, 27, 129, 82, 96, 4, 1, 97, 9, 226, 147, 146, 145, 144, 97, 24, 115, 86, 91, 96, 32, 96, 64, 81, 128, 131, 3, 129, 95, 135, 90, 241, 21, 128, 21, 97, 9, 254, 87, 61, 95, 128, 62, 61, 95, 253, 91, 80, 80, 80, 80, 96, 64, 81, 61, 96, 31, 25, 96, 31, 130, 1, 22, 130, 1, 128, 96, 64, 82, 80, 129, 1, 144, 97, 10, 34, 145, 144, 97, 24, 207, 86, 91, 123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 20, 91, 97, 10, 130, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 10, 121, 144, 97, 25, 68, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 80, 80, 80, 86, 91, 95, 128, 95, 131, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 144, 84, 144, 97, 1, 0, 10, 144, 4, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 144, 80, 95, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 3, 97, 11, 40, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 11, 31, 144, 97, 22, 79, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 145, 144, 80, 86, 91, 95, 128, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 130, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 3, 97, 11, 156, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 11, 147, 144, 97, 25, 172, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 96, 1, 95, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 84, 144, 80, 145, 144, 80, 86, 91, 96, 96, 96, 64, 81, 128, 96, 64, 1, 96, 64, 82, 128, 96, 3, 129, 82, 96, 32, 1, 127, 84, 69, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 80, 144, 80, 144, 86, 91, 128, 96, 3, 95, 51, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 132, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 97, 1, 0, 10, 129, 84, 129, 96, 255, 2, 25, 22, 144, 131, 21, 21, 2, 23, 144, 85, 80, 129, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 51, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 127, 23, 48, 126, 171, 57, 171, 97, 7, 232, 137, 152, 69, 173, 61, 89, 189, 150, 83, 242, 0, 242, 32, 146, 4, 137, 202, 43, 89, 55, 105, 108, 49, 131, 96, 64, 81, 97, 13, 10, 145, 144, 97, 17, 246, 86, 91, 96, 64, 81, 128, 145, 3, 144, 163, 80, 80, 86, 91, 97, 13, 33, 133, 133, 133, 97, 6, 121, 86, 91, 95, 132, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 59, 20, 128, 97, 14, 10, 87, 80, 99, 21, 11, 122, 2, 96, 224, 27, 123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 132, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 99, 21, 11, 122, 2, 51, 136, 135, 135, 135, 96, 64, 81, 134, 99, 255, 255, 255, 255, 22, 96, 224, 27, 129, 82, 96, 4, 1, 97, 13, 169, 149, 148, 147, 146, 145, 144, 97, 26, 4, 86, 91, 96, 32, 96, 64, 81, 128, 131, 3, 129, 95, 135, 90, 241, 21, 128, 21, 97, 13, 197, 87, 61, 95, 128, 62, 61, 95, 253, 91, 80, 80, 80, 80, 96, 64, 81, 61, 96, 31, 25, 96, 31, 130, 1, 22, 130, 1, 128, 96, 64, 82, 80, 129, 1, 144, 97, 13, 233, 145, 144, 97, 24, 207, 86, 91, 123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 20, 91, 97, 14, 73, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 14, 64, 144, 97, 25, 68, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 80, 80, 80, 80, 80, 86, 91, 96, 96, 97, 14, 91, 130, 97, 15, 214, 86, 91, 96, 64, 81, 96, 32, 1, 97, 14, 107, 145, 144, 97, 26, 176, 86, 91, 96, 64, 81, 96, 32, 129, 131, 3, 3, 129, 82, 144, 96, 64, 82, 144, 80, 145, 144, 80, 86, 91, 96, 3, 96, 32, 82, 129, 95, 82, 96, 64, 95, 32, 96, 32, 82, 128, 95, 82, 96, 64, 95, 32, 95, 145, 80, 145, 80, 144, 84, 144, 97, 1, 0, 10, 144, 4, 96, 255, 22, 129, 86, 91, 95, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 20, 128, 97, 15, 103, 87, 80, 96, 3, 95, 133, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 132, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 144, 84, 144, 97, 1, 0, 10, 144, 4, 96, 255, 22, 91, 128, 97, 15, 205, 87, 80, 96, 2, 95, 131, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 144, 84, 144, 97, 1, 0, 10, 144, 4, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 20, 91, 144, 80, 147, 146, 80, 80, 80, 86, 91, 96, 96, 95, 130, 3, 97, 16, 28, 87, 96, 64, 81, 128, 96, 64, 1, 96, 64, 82, 128, 96, 1, 129, 82, 96, 32, 1, 127, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 80, 144, 80, 97, 17, 79, 86, 91, 95, 130, 144, 80, 95, 91, 95, 130, 20, 97, 16, 75, 87, 128, 128, 97, 16, 52, 144, 97, 23, 249, 86, 91, 145, 80, 80, 96, 10, 130, 97, 16, 68, 145, 144, 97, 27, 2, 86, 91, 145, 80, 97, 16, 34, 86, 91, 95, 129, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 16, 102, 87, 97, 16, 101, 97, 27, 50, 86, 91, 91, 96, 64, 81, 144, 128, 130, 82, 128, 96, 31, 1, 96, 31, 25, 22, 96, 32, 1, 130, 1, 96, 64, 82, 128, 21, 97, 16, 152, 87, 129, 96, 32, 1, 96, 1, 130, 2, 128, 54, 131, 55, 128, 130, 1, 145, 80, 80, 144, 80, 91, 80, 144, 80, 95, 130, 144, 80, 91, 95, 134, 20, 97, 17, 71, 87, 96, 1, 129, 97, 16, 180, 145, 144, 97, 27, 95, 86, 91, 144, 80, 95, 96, 10, 128, 136, 97, 16, 197, 145, 144, 97, 27, 2, 86, 91, 97, 16, 207, 145, 144, 97, 27, 146, 86, 91, 135, 97, 16, 218, 145, 144, 97, 27, 95, 86, 91, 96, 48, 97, 16, 230, 145, 144, 97, 27, 223, 86, 91, 144, 80, 95, 129, 96, 248, 27, 144, 80, 128, 132, 132, 129, 81, 129, 16, 97, 17, 3, 87, 97, 17, 2, 97, 28, 19, 86, 91, 91, 96, 32, 1, 1, 144, 126, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 144, 129, 95, 26, 144, 83, 80, 96, 10, 136, 97, 17, 62, 145, 144, 97, 27, 2, 86, 91, 151, 80, 80, 80, 97, 16, 160, 86, 91, 129, 148, 80, 80, 80, 80, 80, 91, 145, 144, 80, 86, 91, 95, 128, 253, 91, 95, 128, 253, 91, 95, 127, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 22, 144, 80, 145, 144, 80, 86, 91, 97, 17, 144, 129, 97, 17, 92, 86, 91, 129, 20, 97, 17, 154, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 17, 171, 129, 97, 17, 135, 86, 91, 146, 145, 80, 80, 86, 91, 95, 96, 32, 130, 132, 3, 18, 21, 97, 17, 198, 87, 97, 17, 197, 97, 17, 84, 86, 91, 91, 95, 97, 17, 211, 132, 130, 133, 1, 97, 17, 157, 86, 91, 145, 80, 80, 146, 145, 80, 80, 86, 91, 95, 129, 21, 21, 144, 80, 145, 144, 80, 86, 91, 97, 17, 240, 129, 97, 17, 220, 86, 91, 130, 82, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 97, 18, 9, 95, 131, 1, 132, 97, 17, 231, 86, 91, 146, 145, 80, 80, 86, 91, 95, 129, 81, 144, 80, 145, 144, 80, 86, 91, 95, 130, 130, 82, 96, 32, 130, 1, 144, 80, 146, 145, 80, 80, 86, 91, 95, 91, 131, 129, 16, 21, 97, 18, 70, 87, 128, 130, 1, 81, 129, 132, 1, 82, 96, 32, 129, 1, 144, 80, 97, 18, 43, 86, 91, 95, 132, 132, 1, 82, 80, 80, 80, 80, 86, 91, 95, 96, 31, 25, 96, 31, 131, 1, 22, 144, 80, 145, 144, 80, 86, 91, 95, 97, 18, 107, 130, 97, 18, 15, 86, 91, 97, 18, 117, 129, 133, 97, 18, 25, 86, 91, 147, 80, 97, 18, 133, 129, 133, 96, 32, 134, 1, 97, 18, 41, 86, 91, 97, 18, 142, 129, 97, 18, 81, 86, 91, 132, 1, 145, 80, 80, 146, 145, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 18, 177, 129, 132, 97, 18, 97, 86, 91, 144, 80, 146, 145, 80, 80, 86, 91, 95, 129, 144, 80, 145, 144, 80, 86, 91, 97, 18, 203, 129, 97, 18, 185, 86, 91, 129, 20, 97, 18, 213, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 18, 230, 129, 97, 18, 194, 86, 91, 146, 145, 80, 80, 86, 91, 95, 96, 32, 130, 132, 3, 18, 21, 97, 19, 1, 87, 97, 19, 0, 97, 17, 84, 86, 91, 91, 95, 97, 19, 14, 132, 130, 133, 1, 97, 18, 216, 86, 91, 145, 80, 80, 146, 145, 80, 80, 86, 91, 95, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 130, 22, 144, 80, 145, 144, 80, 86, 91, 95, 97, 19, 64, 130, 97, 19, 23, 86, 91, 144, 80, 145, 144, 80, 86, 91, 97, 19, 80, 129, 97, 19, 54, 86, 91, 130, 82, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 97, 19, 105, 95, 131, 1, 132, 97, 19, 71, 86, 91, 146, 145, 80, 80, 86, 91, 97, 19, 120, 129, 97, 19, 54, 86, 91, 129, 20, 97, 19, 130, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 19, 147, 129, 97, 19, 111, 86, 91, 146, 145, 80, 80, 86, 91, 95, 128, 96, 64, 131, 133, 3, 18, 21, 97, 19, 175, 87, 97, 19, 174, 97, 17, 84, 86, 91, 91, 95, 97, 19, 188, 133, 130, 134, 1, 97, 19, 133, 86, 91, 146, 80, 80, 96, 32, 97, 19, 205, 133, 130, 134, 1, 97, 18, 216, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 91, 95, 128, 95, 96, 96, 132, 134, 3, 18, 21, 97, 19, 238, 87, 97, 19, 237, 97, 17, 84, 86, 91, 91, 95, 97, 19, 251, 134, 130, 135, 1, 97, 19, 133, 86, 91, 147, 80, 80, 96, 32, 97, 20, 12, 134, 130, 135, 1, 97, 19, 133, 86, 91, 146, 80, 80, 96, 64, 97, 20, 29, 134, 130, 135, 1, 97, 18, 216, 86, 91, 145, 80, 80, 146, 80, 146, 80, 146, 86, 91, 95, 96, 32, 130, 132, 3, 18, 21, 97, 20, 60, 87, 97, 20, 59, 97, 17, 84, 86, 91, 91, 95, 97, 20, 73, 132, 130, 133, 1, 97, 19, 133, 86, 91, 145, 80, 80, 146, 145, 80, 80, 86, 91, 97, 20, 91, 129, 97, 18, 185, 86, 91, 130, 82, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 97, 20, 116, 95, 131, 1, 132, 97, 20, 82, 86, 91, 146, 145, 80, 80, 86, 91, 97, 20, 131, 129, 97, 17, 220, 86, 91, 129, 20, 97, 20, 141, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 20, 158, 129, 97, 20, 122, 86, 91, 146, 145, 80, 80, 86, 91, 95, 128, 96, 64, 131, 133, 3, 18, 21, 97, 20, 186, 87, 97, 20, 185, 97, 17, 84, 86, 91, 91, 95, 97, 20, 199, 133, 130, 134, 1, 97, 19, 133, 86, 91, 146, 80, 80, 96, 32, 97, 20, 216, 133, 130, 134, 1, 97, 20, 144, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 91, 95, 128, 253, 91, 95, 128, 253, 91, 95, 128, 253, 91, 95, 128, 131, 96, 31, 132, 1, 18, 97, 21, 3, 87, 97, 21, 2, 97, 20, 226, 86, 91, 91, 130, 53, 144, 80, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 21, 32, 87, 97, 21, 31, 97, 20, 230, 86, 91, 91, 96, 32, 131, 1, 145, 80, 131, 96, 1, 130, 2, 131, 1, 17, 21, 97, 21, 60, 87, 97, 21, 59, 97, 20, 234, 86, 91, 91, 146, 80, 146, 144, 80, 86, 91, 95, 128, 95, 128, 95, 96, 128, 134, 136, 3, 18, 21, 97, 21, 92, 87, 97, 21, 91, 97, 17, 84, 86, 91, 91, 95, 97, 21, 105, 136, 130, 137, 1, 97, 19, 133, 86, 91, 149, 80, 80, 96, 32, 97, 21, 122, 136, 130, 137, 1, 97, 19, 133, 86, 91, 148, 80, 80, 96, 64, 97, 21, 139, 136, 130, 137, 1, 97, 18, 216, 86, 91, 147, 80, 80, 96, 96, 134, 1, 53, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 21, 172, 87, 97, 21, 171, 97, 17, 88, 86, 91, 91, 97, 21, 184, 136, 130, 137, 1, 97, 20, 238, 86, 91, 146, 80, 146, 80, 80, 146, 149, 80, 146, 149, 144, 147, 80, 86, 91, 95, 128, 96, 64, 131, 133, 3, 18, 21, 97, 21, 221, 87, 97, 21, 220, 97, 17, 84, 86, 91, 91, 95, 97, 21, 234, 133, 130, 134, 1, 97, 19, 133, 86, 91, 146, 80, 80, 96, 32, 97, 21, 251, 133, 130, 134, 1, 97, 19, 133, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 91, 127, 116, 111, 107, 101, 110, 32, 100, 111, 101, 115, 110, 39, 116, 32, 101, 120, 105, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 130, 1, 82, 80, 86, 91, 95, 97, 22, 57, 96, 19, 131, 97, 18, 25, 86, 91, 145, 80, 97, 22, 68, 130, 97, 22, 5, 86, 91, 96, 32, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 22, 102, 129, 97, 22, 45, 86, 91, 144, 80, 145, 144, 80, 86, 91, 127, 110, 111, 116, 32, 97, 117, 116, 104, 111, 114, 105, 122, 101, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 130, 1, 82, 80, 86, 91, 95, 97, 22, 161, 96, 14, 131, 97, 18, 25, 86, 91, 145, 80, 97, 22, 172, 130, 97, 22, 109, 86, 91, 96, 32, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 22, 206, 129, 97, 22, 149, 86, 91, 144, 80, 145, 144, 80, 86, 91, 127, 102, 114, 111, 109, 32, 33, 61, 32, 111, 119, 110, 101, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 130, 1, 82, 80, 86, 91, 95, 97, 23, 9, 96, 13, 131, 97, 18, 25, 86, 91, 145, 80, 97, 23, 20, 130, 97, 22, 213, 86, 91, 96, 32, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 23, 54, 129, 97, 22, 253, 86, 91, 144, 80, 145, 144, 80, 86, 91, 127, 116, 114, 97, 110, 115, 102, 101, 114, 32, 116, 111, 32, 122, 101, 114, 111, 32, 97, 100, 100, 114, 101, 115, 115, 0, 0, 0, 0, 0, 0, 0, 0, 95, 130, 1, 82, 80, 86, 91, 95, 97, 23, 113, 96, 24, 131, 97, 18, 25, 86, 91, 145, 80, 97, 23, 124, 130, 97, 23, 61, 86, 91, 96, 32, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 23, 158, 129, 97, 23, 101, 86, 91, 144, 80, 145, 144, 80, 86, 91, 127, 78, 72, 123, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 82, 96, 17, 96, 4, 82, 96, 36, 95, 253, 91, 95, 97, 23, 220, 130, 97, 18, 185, 86, 91, 145, 80, 95, 130, 3, 97, 23, 238, 87, 97, 23, 237, 97, 23, 165, 86, 91, 91, 96, 1, 130, 3, 144, 80, 145, 144, 80, 86, 91, 95, 97, 24, 3, 130, 97, 18, 185, 86, 91, 145, 80, 127, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 130, 3, 97, 24, 53, 87, 97, 24, 52, 97, 23, 165, 86, 91, 91, 96, 1, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 130, 130, 82, 96, 32, 130, 1, 144, 80, 146, 145, 80, 80, 86, 91, 80, 86, 91, 95, 97, 24, 94, 95, 131, 97, 24, 64, 86, 91, 145, 80, 97, 24, 105, 130, 97, 24, 80, 86, 91, 95, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 96, 128, 130, 1, 144, 80, 97, 24, 134, 95, 131, 1, 134, 97, 19, 71, 86, 91, 97, 24, 147, 96, 32, 131, 1, 133, 97, 19, 71, 86, 91, 97, 24, 160, 96, 64, 131, 1, 132, 97, 20, 82, 86, 91, 129, 129, 3, 96, 96, 131, 1, 82, 97, 24, 177, 129, 97, 24, 83, 86, 91, 144, 80, 148, 147, 80, 80, 80, 80, 86, 91, 95, 129, 81, 144, 80, 97, 24, 201, 129, 97, 17, 135, 86, 91, 146, 145, 80, 80, 86, 91, 95, 96, 32, 130, 132, 3, 18, 21, 97, 24, 228, 87, 97, 24, 227, 97, 17, 84, 86, 91, 91, 95, 97, 24, 241, 132, 130, 133, 1, 97, 24, 187, 86, 91, 145, 80, 80, 146, 145, 80, 80, 86, 91, 127, 117, 110, 115, 97, 102, 101, 32, 114, 101, 99, 105, 112, 105, 101, 110, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 130, 1, 82, 80, 86, 91, 95, 97, 25, 46, 96, 16, 131, 97, 18, 25, 86, 91, 145, 80, 97, 25, 57, 130, 97, 24, 250, 86, 91, 96, 32, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 25, 91, 129, 97, 25, 34, 86, 91, 144, 80, 145, 144, 80, 86, 91, 127, 111, 119, 110, 101, 114, 32, 61, 32, 122, 101, 114, 111, 32, 97, 100, 100, 114, 101, 115, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 130, 1, 82, 80, 86, 91, 95, 97, 25, 150, 96, 20, 131, 97, 18, 25, 86, 91, 145, 80, 97, 25, 161, 130, 97, 25, 98, 86, 91, 96, 32, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 25, 195, 129, 97, 25, 138, 86, 91, 144, 80, 145, 144, 80, 86, 91, 130, 129, 131, 55, 95, 131, 131, 1, 82, 80, 80, 80, 86, 91, 95, 97, 25, 227, 131, 133, 97, 24, 64, 86, 91, 147, 80, 97, 25, 240, 131, 133, 132, 97, 25, 202, 86, 91, 97, 25, 249, 131, 97, 18, 81, 86, 91, 132, 1, 144, 80, 147, 146, 80, 80, 80, 86, 91, 95, 96, 128, 130, 1, 144, 80, 97, 26, 23, 95, 131, 1, 136, 97, 19, 71, 86, 91, 97, 26, 36, 96, 32, 131, 1, 135, 97, 19, 71, 86, 91, 97, 26, 49, 96, 64, 131, 1, 134, 97, 20, 82, 86, 91, 129, 129, 3, 96, 96, 131, 1, 82, 97, 26, 68, 129, 132, 134, 97, 25, 216, 86, 91, 144, 80, 150, 149, 80, 80, 80, 80, 80, 80, 86, 91, 127, 104, 116, 116, 112, 115, 58, 47, 47, 101, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 80, 86, 91, 95, 129, 144, 80, 146, 145, 80, 80, 86, 91, 95, 97, 26, 138, 130, 97, 18, 15, 86, 91, 97, 26, 148, 129, 133, 97, 26, 118, 86, 91, 147, 80, 97, 26, 164, 129, 133, 96, 32, 134, 1, 97, 18, 41, 86, 91, 128, 132, 1, 145, 80, 80, 146, 145, 80, 80, 86, 91, 95, 97, 26, 186, 130, 97, 26, 80, 86, 91, 96, 20, 130, 1, 145, 80, 97, 26, 202, 130, 132, 97, 26, 128, 86, 91, 145, 80, 129, 144, 80, 146, 145, 80, 80, 86, 91, 127, 78, 72, 123, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 82, 96, 18, 96, 4, 82, 96, 36, 95, 253, 91, 95, 97, 27, 12, 130, 97, 18, 185, 86, 91, 145, 80, 97, 27, 23, 131, 97, 18, 185, 86, 91, 146, 80, 130, 97, 27, 39, 87, 97, 27, 38, 97, 26, 213, 86, 91, 91, 130, 130, 4, 144, 80, 146, 145, 80, 80, 86, 91, 127, 78, 72, 123, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 82, 96, 65, 96, 4, 82, 96, 36, 95, 253, 91, 95, 97, 27, 105, 130, 97, 18, 185, 86, 91, 145, 80, 97, 27, 116, 131, 97, 18, 185, 86, 91, 146, 80, 130, 130, 3, 144, 80, 129, 129, 17, 21, 97, 27, 140, 87, 97, 27, 139, 97, 23, 165, 86, 91, 91, 146, 145, 80, 80, 86, 91, 95, 97, 27, 156, 130, 97, 18, 185, 86, 91, 145, 80, 97, 27, 167, 131, 97, 18, 185, 86, 91, 146, 80, 130, 130, 2, 97, 27, 181, 129, 97, 18, 185, 86, 91, 145, 80, 130, 130, 4, 132, 20, 131, 21, 23, 97, 27, 204, 87, 97, 27, 203, 97, 23, 165, 86, 91, 91, 80, 146, 145, 80, 80, 86, 91, 95, 96, 255, 130, 22, 144, 80, 145, 144, 80, 86, 91, 95, 97, 27, 233, 130, 97, 27, 211, 86, 91, 145, 80, 97, 27, 244, 131, 97, 27, 211, 86, 91, 146, 80, 130, 130, 1, 144, 80, 96, 255, 129, 17, 21, 97, 28, 13, 87, 97, 28, 12, 97, 23, 165, 86, 91, 91, 146, 145, 80, 80, 86, 91, 127, 78, 72, 123, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 82, 96, 50, 96, 4, 82, 96, 36, 95, 253, 254, 162, 100, 105, 112, 102, 115, 88, 34, 18, 32, 152, 17, 252, 33, 148, 72, 1, 112, 229, 152, 121, 145, 96, 180, 163, 194, 162, 156, 32, 193, 68, 101, 246, 14, 74, 226, 43, 102, 172, 20, 137, 30, 100, 115, 111, 108, 99, 67, 0, 8, 21, 0, 51}) - testERC1155ContractBytecode = Bytecode([]byte{96, 128, 96, 64, 82, 52, 128, 21, 97, 0, 15, 87, 95, 128, 253, 91, 80, 96, 4, 54, 16, 97, 0, 95, 87, 95, 53, 96, 224, 28, 128, 98, 253, 213, 142, 20, 97, 0, 99, 87, 128, 99, 46, 178, 194, 214, 20, 97, 0, 147, 87, 128, 99, 78, 18, 115, 244, 20, 97, 0, 175, 87, 128, 99, 162, 44, 180, 101, 20, 97, 0, 223, 87, 128, 99, 233, 133, 233, 197, 20, 97, 0, 251, 87, 128, 99, 242, 66, 67, 42, 20, 97, 1, 43, 87, 91, 95, 128, 253, 91, 97, 0, 125, 96, 4, 128, 54, 3, 129, 1, 144, 97, 0, 120, 145, 144, 97, 2, 10, 86, 91, 97, 1, 71, 86, 91, 96, 64, 81, 97, 0, 138, 145, 144, 97, 2, 87, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 0, 173, 96, 4, 128, 54, 3, 129, 1, 144, 97, 0, 168, 145, 144, 97, 3, 38, 86, 91, 97, 1, 78, 86, 91, 0, 91, 97, 0, 201, 96, 4, 128, 54, 3, 129, 1, 144, 97, 0, 196, 145, 144, 97, 4, 82, 86, 91, 97, 1, 88, 86, 91, 96, 64, 81, 97, 0, 214, 145, 144, 97, 5, 135, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 0, 249, 96, 4, 128, 54, 3, 129, 1, 144, 97, 0, 244, 145, 144, 97, 5, 220, 86, 91, 97, 1, 98, 86, 91, 0, 91, 97, 1, 21, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 16, 145, 144, 97, 6, 26, 86, 91, 97, 1, 102, 86, 91, 96, 64, 81, 97, 1, 34, 145, 144, 97, 6, 103, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 69, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 64, 145, 144, 97, 6, 128, 86, 91, 97, 1, 109, 86, 91, 0, 91, 95, 146, 145, 80, 80, 86, 91, 80, 80, 80, 80, 80, 80, 80, 80, 86, 91, 96, 96, 148, 147, 80, 80, 80, 80, 86, 91, 80, 80, 86, 91, 95, 146, 145, 80, 80, 86, 91, 80, 80, 80, 80, 80, 80, 86, 91, 95, 128, 253, 91, 95, 128, 253, 91, 95, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 130, 22, 144, 80, 145, 144, 80, 86, 91, 95, 97, 1, 166, 130, 97, 1, 125, 86, 91, 144, 80, 145, 144, 80, 86, 91, 97, 1, 182, 129, 97, 1, 156, 86, 91, 129, 20, 97, 1, 192, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 1, 209, 129, 97, 1, 173, 86, 91, 146, 145, 80, 80, 86, 91, 95, 129, 144, 80, 145, 144, 80, 86, 91, 97, 1, 233, 129, 97, 1, 215, 86, 91, 129, 20, 97, 1, 243, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 2, 4, 129, 97, 1, 224, 86, 91, 146, 145, 80, 80, 86, 91, 95, 128, 96, 64, 131, 133, 3, 18, 21, 97, 2, 32, 87, 97, 2, 31, 97, 1, 117, 86, 91, 91, 95, 97, 2, 45, 133, 130, 134, 1, 97, 1, 195, 86, 91, 146, 80, 80, 96, 32, 97, 2, 62, 133, 130, 134, 1, 97, 1, 246, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 91, 97, 2, 81, 129, 97, 1, 215, 86, 91, 130, 82, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 97, 2, 106, 95, 131, 1, 132, 97, 2, 72, 86, 91, 146, 145, 80, 80, 86, 91, 95, 128, 253, 91, 95, 128, 253, 91, 95, 128, 253, 91, 95, 128, 131, 96, 31, 132, 1, 18, 97, 2, 145, 87, 97, 2, 144, 97, 2, 112, 86, 91, 91, 130, 53, 144, 80, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 2, 174, 87, 97, 2, 173, 97, 2, 116, 86, 91, 91, 96, 32, 131, 1, 145, 80, 131, 96, 32, 130, 2, 131, 1, 17, 21, 97, 2, 202, 87, 97, 2, 201, 97, 2, 120, 86, 91, 91, 146, 80, 146, 144, 80, 86, 91, 95, 128, 131, 96, 31, 132, 1, 18, 97, 2, 230, 87, 97, 2, 229, 97, 2, 112, 86, 91, 91, 130, 53, 144, 80, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 3, 3, 87, 97, 3, 2, 97, 2, 116, 86, 91, 91, 96, 32, 131, 1, 145, 80, 131, 96, 1, 130, 2, 131, 1, 17, 21, 97, 3, 31, 87, 97, 3, 30, 97, 2, 120, 86, 91, 91, 146, 80, 146, 144, 80, 86, 91, 95, 128, 95, 128, 95, 128, 95, 128, 96, 160, 137, 139, 3, 18, 21, 97, 3, 66, 87, 97, 3, 65, 97, 1, 117, 86, 91, 91, 95, 97, 3, 79, 139, 130, 140, 1, 97, 1, 195, 86, 91, 152, 80, 80, 96, 32, 97, 3, 96, 139, 130, 140, 1, 97, 1, 195, 86, 91, 151, 80, 80, 96, 64, 137, 1, 53, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 3, 129, 87, 97, 3, 128, 97, 1, 121, 86, 91, 91, 97, 3, 141, 139, 130, 140, 1, 97, 2, 124, 86, 91, 150, 80, 150, 80, 80, 96, 96, 137, 1, 53, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 3, 176, 87, 97, 3, 175, 97, 1, 121, 86, 91, 91, 97, 3, 188, 139, 130, 140, 1, 97, 2, 124, 86, 91, 148, 80, 148, 80, 80, 96, 128, 137, 1, 53, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 3, 223, 87, 97, 3, 222, 97, 1, 121, 86, 91, 91, 97, 3, 235, 139, 130, 140, 1, 97, 2, 209, 86, 91, 146, 80, 146, 80, 80, 146, 149, 152, 80, 146, 149, 152, 144, 147, 150, 80, 86, 91, 95, 128, 131, 96, 31, 132, 1, 18, 97, 4, 18, 87, 97, 4, 17, 97, 2, 112, 86, 91, 91, 130, 53, 144, 80, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 4, 47, 87, 97, 4, 46, 97, 2, 116, 86, 91, 91, 96, 32, 131, 1, 145, 80, 131, 96, 32, 130, 2, 131, 1, 17, 21, 97, 4, 75, 87, 97, 4, 74, 97, 2, 120, 86, 91, 91, 146, 80, 146, 144, 80, 86, 91, 95, 128, 95, 128, 96, 64, 133, 135, 3, 18, 21, 97, 4, 106, 87, 97, 4, 105, 97, 1, 117, 86, 91, 91, 95, 133, 1, 53, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 4, 135, 87, 97, 4, 134, 97, 1, 121, 86, 91, 91, 97, 4, 147, 135, 130, 136, 1, 97, 3, 253, 86, 91, 148, 80, 148, 80, 80, 96, 32, 133, 1, 53, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 4, 182, 87, 97, 4, 181, 97, 1, 121, 86, 91, 91, 97, 4, 194, 135, 130, 136, 1, 97, 2, 124, 86, 91, 146, 80, 146, 80, 80, 146, 149, 145, 148, 80, 146, 80, 86, 91, 95, 129, 81, 144, 80, 145, 144, 80, 86, 91, 95, 130, 130, 82, 96, 32, 130, 1, 144, 80, 146, 145, 80, 80, 86, 91, 95, 129, 144, 80, 96, 32, 130, 1, 144, 80, 145, 144, 80, 86, 91, 97, 5, 2, 129, 97, 1, 215, 86, 91, 130, 82, 80, 80, 86, 91, 95, 97, 5, 19, 131, 131, 97, 4, 249, 86, 91, 96, 32, 131, 1, 144, 80, 146, 145, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 97, 5, 53, 130, 97, 4, 208, 86, 91, 97, 5, 63, 129, 133, 97, 4, 218, 86, 91, 147, 80, 97, 5, 74, 131, 97, 4, 234, 86, 91, 128, 95, 91, 131, 129, 16, 21, 97, 5, 122, 87, 129, 81, 97, 5, 97, 136, 130, 97, 5, 8, 86, 91, 151, 80, 97, 5, 108, 131, 97, 5, 31, 86, 91, 146, 80, 80, 96, 1, 129, 1, 144, 80, 97, 5, 77, 86, 91, 80, 133, 147, 80, 80, 80, 80, 146, 145, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 5, 159, 129, 132, 97, 5, 43, 86, 91, 144, 80, 146, 145, 80, 80, 86, 91, 95, 129, 21, 21, 144, 80, 145, 144, 80, 86, 91, 97, 5, 187, 129, 97, 5, 167, 86, 91, 129, 20, 97, 5, 197, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 5, 214, 129, 97, 5, 178, 86, 91, 146, 145, 80, 80, 86, 91, 95, 128, 96, 64, 131, 133, 3, 18, 21, 97, 5, 242, 87, 97, 5, 241, 97, 1, 117, 86, 91, 91, 95, 97, 5, 255, 133, 130, 134, 1, 97, 1, 195, 86, 91, 146, 80, 80, 96, 32, 97, 6, 16, 133, 130, 134, 1, 97, 5, 200, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 91, 95, 128, 96, 64, 131, 133, 3, 18, 21, 97, 6, 48, 87, 97, 6, 47, 97, 1, 117, 86, 91, 91, 95, 97, 6, 61, 133, 130, 134, 1, 97, 1, 195, 86, 91, 146, 80, 80, 96, 32, 97, 6, 78, 133, 130, 134, 1, 97, 1, 195, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 91, 97, 6, 97, 129, 97, 5, 167, 86, 91, 130, 82, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 97, 6, 122, 95, 131, 1, 132, 97, 6, 88, 86, 91, 146, 145, 80, 80, 86, 91, 95, 128, 95, 128, 95, 128, 96, 160, 135, 137, 3, 18, 21, 97, 6, 154, 87, 97, 6, 153, 97, 1, 117, 86, 91, 91, 95, 97, 6, 167, 137, 130, 138, 1, 97, 1, 195, 86, 91, 150, 80, 80, 96, 32, 97, 6, 184, 137, 130, 138, 1, 97, 1, 195, 86, 91, 149, 80, 80, 96, 64, 97, 6, 201, 137, 130, 138, 1, 97, 1, 246, 86, 91, 148, 80, 80, 96, 96, 97, 6, 218, 137, 130, 138, 1, 97, 1, 246, 86, 91, 147, 80, 80, 96, 128, 135, 1, 53, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 6, 251, 87, 97, 6, 250, 97, 1, 121, 86, 91, 91, 97, 7, 7, 137, 130, 138, 1, 97, 2, 209, 86, 91, 146, 80, 146, 80, 80, 146, 149, 80, 146, 149, 80, 146, 149, 86, 254, 162, 100, 105, 112, 102, 115, 88, 34, 18, 32, 148, 159, 178, 116, 208, 174, 11, 170, 125, 189, 81, 142, 193, 10, 233, 27, 120, 223, 28, 202, 63, 46, 164, 30, 109, 18, 61, 127, 117, 110, 98, 132, 100, 115, 111, 108, 99, 67, 0, 8, 21, 0, 51}) + testERC20ContractBytecode = ByteCode([]byte{96, 128, 96, 64, 82, 52, 128, 21, 97, 0, 15, 87, 95, 128, 253, 91, 80, 96, 4, 54, 16, 97, 0, 145, 87, 95, 53, 96, 224, 28, 128, 99, 49, 60, 229, 103, 17, 97, 0, 100, 87, 128, 99, 49, 60, 229, 103, 20, 97, 1, 49, 87, 128, 99, 112, 160, 130, 49, 20, 97, 1, 79, 87, 128, 99, 149, 216, 155, 65, 20, 97, 1, 127, 87, 128, 99, 169, 5, 156, 187, 20, 97, 1, 157, 87, 128, 99, 221, 98, 237, 62, 20, 97, 1, 205, 87, 97, 0, 145, 86, 91, 128, 99, 6, 253, 222, 3, 20, 97, 0, 149, 87, 128, 99, 9, 94, 167, 179, 20, 97, 0, 179, 87, 128, 99, 24, 22, 13, 221, 20, 97, 0, 227, 87, 128, 99, 35, 184, 114, 221, 20, 97, 1, 1, 87, 91, 95, 128, 253, 91, 97, 0, 157, 97, 1, 253, 86, 91, 96, 64, 81, 97, 0, 170, 145, 144, 97, 3, 48, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 0, 205, 96, 4, 128, 54, 3, 129, 1, 144, 97, 0, 200, 145, 144, 97, 3, 225, 86, 91, 97, 2, 58, 86, 91, 96, 64, 81, 97, 0, 218, 145, 144, 97, 4, 57, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 0, 235, 97, 2, 65, 86, 91, 96, 64, 81, 97, 0, 248, 145, 144, 97, 4, 97, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 27, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 22, 145, 144, 97, 4, 122, 86, 91, 97, 2, 69, 86, 91, 96, 64, 81, 97, 1, 40, 145, 144, 97, 4, 57, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 57, 97, 2, 77, 86, 91, 96, 64, 81, 97, 1, 70, 145, 144, 97, 4, 229, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 105, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 100, 145, 144, 97, 4, 254, 86, 91, 97, 2, 85, 86, 91, 96, 64, 81, 97, 1, 118, 145, 144, 97, 4, 97, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 135, 97, 2, 91, 86, 91, 96, 64, 81, 97, 1, 148, 145, 144, 97, 3, 48, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 183, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 178, 145, 144, 97, 3, 225, 86, 91, 97, 2, 152, 86, 91, 96, 64, 81, 97, 1, 196, 145, 144, 97, 4, 57, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 231, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 226, 145, 144, 97, 5, 41, 86, 91, 97, 2, 159, 86, 91, 96, 64, 81, 97, 1, 244, 145, 144, 97, 4, 97, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 96, 96, 96, 64, 81, 128, 96, 64, 1, 96, 64, 82, 128, 96, 16, 129, 82, 96, 32, 1, 127, 84, 101, 115, 116, 32, 69, 82, 67, 50, 48, 32, 84, 111, 107, 101, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 80, 144, 80, 144, 86, 91, 95, 146, 145, 80, 80, 86, 91, 95, 144, 86, 91, 95, 147, 146, 80, 80, 80, 86, 91, 95, 96, 18, 144, 80, 144, 86, 91, 95, 145, 144, 80, 86, 91, 96, 96, 96, 64, 81, 128, 96, 64, 1, 96, 64, 82, 128, 96, 3, 129, 82, 96, 32, 1, 127, 84, 69, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 80, 144, 80, 144, 86, 91, 95, 146, 145, 80, 80, 86, 91, 95, 146, 145, 80, 80, 86, 91, 95, 129, 81, 144, 80, 145, 144, 80, 86, 91, 95, 130, 130, 82, 96, 32, 130, 1, 144, 80, 146, 145, 80, 80, 86, 91, 95, 91, 131, 129, 16, 21, 97, 2, 221, 87, 128, 130, 1, 81, 129, 132, 1, 82, 96, 32, 129, 1, 144, 80, 97, 2, 194, 86, 91, 95, 132, 132, 1, 82, 80, 80, 80, 80, 86, 91, 95, 96, 31, 25, 96, 31, 131, 1, 22, 144, 80, 145, 144, 80, 86, 91, 95, 97, 3, 2, 130, 97, 2, 166, 86, 91, 97, 3, 12, 129, 133, 97, 2, 176, 86, 91, 147, 80, 97, 3, 28, 129, 133, 96, 32, 134, 1, 97, 2, 192, 86, 91, 97, 3, 37, 129, 97, 2, 232, 86, 91, 132, 1, 145, 80, 80, 146, 145, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 3, 72, 129, 132, 97, 2, 248, 86, 91, 144, 80, 146, 145, 80, 80, 86, 91, 95, 128, 253, 91, 95, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 130, 22, 144, 80, 145, 144, 80, 86, 91, 95, 97, 3, 125, 130, 97, 3, 84, 86, 91, 144, 80, 145, 144, 80, 86, 91, 97, 3, 141, 129, 97, 3, 115, 86, 91, 129, 20, 97, 3, 151, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 3, 168, 129, 97, 3, 132, 86, 91, 146, 145, 80, 80, 86, 91, 95, 129, 144, 80, 145, 144, 80, 86, 91, 97, 3, 192, 129, 97, 3, 174, 86, 91, 129, 20, 97, 3, 202, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 3, 219, 129, 97, 3, 183, 86, 91, 146, 145, 80, 80, 86, 91, 95, 128, 96, 64, 131, 133, 3, 18, 21, 97, 3, 247, 87, 97, 3, 246, 97, 3, 80, 86, 91, 91, 95, 97, 4, 4, 133, 130, 134, 1, 97, 3, 154, 86, 91, 146, 80, 80, 96, 32, 97, 4, 21, 133, 130, 134, 1, 97, 3, 205, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 91, 95, 129, 21, 21, 144, 80, 145, 144, 80, 86, 91, 97, 4, 51, 129, 97, 4, 31, 86, 91, 130, 82, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 97, 4, 76, 95, 131, 1, 132, 97, 4, 42, 86, 91, 146, 145, 80, 80, 86, 91, 97, 4, 91, 129, 97, 3, 174, 86, 91, 130, 82, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 97, 4, 116, 95, 131, 1, 132, 97, 4, 82, 86, 91, 146, 145, 80, 80, 86, 91, 95, 128, 95, 96, 96, 132, 134, 3, 18, 21, 97, 4, 145, 87, 97, 4, 144, 97, 3, 80, 86, 91, 91, 95, 97, 4, 158, 134, 130, 135, 1, 97, 3, 154, 86, 91, 147, 80, 80, 96, 32, 97, 4, 175, 134, 130, 135, 1, 97, 3, 154, 86, 91, 146, 80, 80, 96, 64, 97, 4, 192, 134, 130, 135, 1, 97, 3, 205, 86, 91, 145, 80, 80, 146, 80, 146, 80, 146, 86, 91, 95, 96, 255, 130, 22, 144, 80, 145, 144, 80, 86, 91, 97, 4, 223, 129, 97, 4, 202, 86, 91, 130, 82, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 97, 4, 248, 95, 131, 1, 132, 97, 4, 214, 86, 91, 146, 145, 80, 80, 86, 91, 95, 96, 32, 130, 132, 3, 18, 21, 97, 5, 19, 87, 97, 5, 18, 97, 3, 80, 86, 91, 91, 95, 97, 5, 32, 132, 130, 133, 1, 97, 3, 154, 86, 91, 145, 80, 80, 146, 145, 80, 80, 86, 91, 95, 128, 96, 64, 131, 133, 3, 18, 21, 97, 5, 63, 87, 97, 5, 62, 97, 3, 80, 86, 91, 91, 95, 97, 5, 76, 133, 130, 134, 1, 97, 3, 154, 86, 91, 146, 80, 80, 96, 32, 97, 5, 93, 133, 130, 134, 1, 97, 3, 154, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 254, 162, 100, 105, 112, 102, 115, 88, 34, 18, 32, 72, 111, 79, 210, 211, 6, 225, 165, 48, 231, 52, 251, 88, 109, 115, 207, 52, 76, 165, 40, 78, 234, 53, 186, 174, 133, 170, 150, 196, 225, 9, 80, 100, 115, 111, 108, 99, 67, 0, 8, 21, 0, 51}) + testERC721ContractBytecode = ByteCode([]byte{96, 128, 96, 64, 82, 52, 128, 21, 97, 0, 15, 87, 95, 128, 253, 91, 80, 96, 4, 54, 16, 97, 0, 205, 87, 95, 53, 96, 224, 28, 128, 99, 99, 82, 33, 30, 17, 97, 0, 138, 87, 128, 99, 162, 44, 180, 101, 17, 97, 0, 100, 87, 128, 99, 162, 44, 180, 101, 20, 97, 2, 33, 87, 128, 99, 184, 141, 79, 222, 20, 97, 2, 61, 87, 128, 99, 200, 123, 86, 221, 20, 97, 2, 89, 87, 128, 99, 233, 133, 233, 197, 20, 97, 2, 137, 87, 97, 0, 205, 86, 91, 128, 99, 99, 82, 33, 30, 20, 97, 1, 163, 87, 128, 99, 112, 160, 130, 49, 20, 97, 1, 211, 87, 128, 99, 149, 216, 155, 65, 20, 97, 2, 3, 87, 97, 0, 205, 86, 91, 128, 99, 1, 255, 201, 167, 20, 97, 0, 209, 87, 128, 99, 6, 253, 222, 3, 20, 97, 1, 1, 87, 128, 99, 8, 24, 18, 252, 20, 97, 1, 31, 87, 128, 99, 9, 94, 167, 179, 20, 97, 1, 79, 87, 128, 99, 35, 184, 114, 221, 20, 97, 1, 107, 87, 128, 99, 66, 132, 46, 14, 20, 97, 1, 135, 87, 91, 95, 128, 253, 91, 97, 0, 235, 96, 4, 128, 54, 3, 129, 1, 144, 97, 0, 230, 145, 144, 97, 17, 177, 86, 91, 97, 2, 185, 86, 91, 96, 64, 81, 97, 0, 248, 145, 144, 97, 17, 246, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 9, 97, 3, 138, 86, 91, 96, 64, 81, 97, 1, 22, 145, 144, 97, 18, 153, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 57, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 52, 145, 144, 97, 18, 236, 86, 91, 97, 3, 199, 86, 91, 96, 64, 81, 97, 1, 70, 145, 144, 97, 19, 86, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 105, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 100, 145, 144, 97, 19, 153, 86, 91, 97, 4, 157, 86, 91, 0, 91, 97, 1, 133, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 128, 145, 144, 97, 19, 215, 86, 91, 97, 6, 121, 86, 91, 0, 91, 97, 1, 161, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 156, 145, 144, 97, 19, 215, 86, 91, 97, 9, 83, 86, 91, 0, 91, 97, 1, 189, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 184, 145, 144, 97, 18, 236, 86, 91, 97, 10, 135, 86, 91, 96, 64, 81, 97, 1, 202, 145, 144, 97, 19, 86, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 237, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 232, 145, 144, 97, 20, 39, 86, 91, 97, 11, 45, 86, 91, 96, 64, 81, 97, 1, 250, 145, 144, 97, 20, 97, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 2, 11, 97, 11, 225, 86, 91, 96, 64, 81, 97, 2, 24, 145, 144, 97, 18, 153, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 2, 59, 96, 4, 128, 54, 3, 129, 1, 144, 97, 2, 54, 145, 144, 97, 20, 164, 86, 91, 97, 12, 30, 86, 91, 0, 91, 97, 2, 87, 96, 4, 128, 54, 3, 129, 1, 144, 97, 2, 82, 145, 144, 97, 21, 67, 86, 91, 97, 13, 22, 86, 91, 0, 91, 97, 2, 115, 96, 4, 128, 54, 3, 129, 1, 144, 97, 2, 110, 145, 144, 97, 18, 236, 86, 91, 97, 14, 80, 86, 91, 96, 64, 81, 97, 2, 128, 145, 144, 97, 18, 153, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 2, 163, 96, 4, 128, 54, 3, 129, 1, 144, 97, 2, 158, 145, 144, 97, 21, 199, 86, 91, 97, 14, 129, 86, 91, 96, 64, 81, 97, 2, 176, 145, 144, 97, 17, 246, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 95, 127, 128, 172, 88, 205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 130, 123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 20, 128, 97, 3, 131, 87, 80, 127, 1, 255, 201, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 130, 123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 20, 91, 144, 80, 145, 144, 80, 86, 91, 96, 96, 96, 64, 81, 128, 96, 64, 1, 96, 64, 82, 128, 96, 11, 129, 82, 96, 32, 1, 127, 84, 101, 115, 116, 32, 69, 82, 67, 55, 50, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 80, 144, 80, 144, 86, 91, 95, 128, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 95, 128, 132, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 144, 84, 144, 97, 1, 0, 10, 144, 4, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 3, 97, 4, 101, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 4, 92, 144, 97, 22, 79, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 96, 2, 95, 131, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 144, 84, 144, 97, 1, 0, 10, 144, 4, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 144, 80, 145, 144, 80, 86, 91, 95, 128, 95, 131, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 144, 84, 144, 97, 1, 0, 10, 144, 4, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 144, 80, 128, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 51, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 20, 128, 97, 5, 139, 87, 80, 96, 3, 95, 130, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 51, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 144, 84, 144, 97, 1, 0, 10, 144, 4, 96, 255, 22, 91, 97, 5, 202, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 5, 193, 144, 97, 22, 183, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 130, 96, 2, 95, 132, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 97, 1, 0, 10, 129, 84, 129, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2, 25, 22, 144, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 2, 23, 144, 85, 80, 129, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 130, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 127, 140, 91, 225, 229, 235, 236, 125, 91, 209, 79, 113, 66, 125, 30, 132, 243, 221, 3, 20, 192, 247, 178, 41, 30, 91, 32, 10, 200, 199, 195, 185, 37, 96, 64, 81, 96, 64, 81, 128, 145, 3, 144, 164, 80, 80, 80, 86, 91, 95, 128, 130, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 144, 84, 144, 97, 1, 0, 10, 144, 4, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 20, 97, 7, 22, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 7, 13, 144, 97, 23, 31, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 95, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 130, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 3, 97, 7, 132, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 7, 123, 144, 97, 23, 135, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 97, 7, 143, 131, 51, 131, 97, 14, 171, 86, 91, 97, 7, 206, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 7, 197, 144, 97, 22, 183, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 96, 1, 95, 132, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 129, 84, 128, 146, 145, 144, 97, 8, 27, 144, 97, 23, 210, 86, 91, 145, 144, 80, 85, 80, 96, 1, 95, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 129, 84, 128, 146, 145, 144, 97, 8, 109, 144, 97, 23, 249, 86, 91, 145, 144, 80, 85, 80, 129, 95, 128, 131, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 97, 1, 0, 10, 129, 84, 129, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2, 25, 22, 144, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 2, 23, 144, 85, 80, 96, 2, 95, 130, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 97, 1, 0, 10, 129, 84, 144, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 2, 25, 22, 144, 85, 128, 130, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 132, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 127, 221, 242, 82, 173, 27, 226, 200, 155, 105, 194, 176, 104, 252, 55, 141, 170, 149, 43, 167, 241, 99, 196, 161, 22, 40, 245, 90, 77, 245, 35, 179, 239, 96, 64, 81, 96, 64, 81, 128, 145, 3, 144, 164, 80, 80, 80, 86, 91, 97, 9, 94, 131, 131, 131, 97, 6, 121, 86, 91, 95, 130, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 59, 20, 128, 97, 10, 67, 87, 80, 99, 21, 11, 122, 2, 96, 224, 27, 123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 130, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 99, 21, 11, 122, 2, 51, 134, 133, 96, 64, 81, 132, 99, 255, 255, 255, 255, 22, 96, 224, 27, 129, 82, 96, 4, 1, 97, 9, 226, 147, 146, 145, 144, 97, 24, 115, 86, 91, 96, 32, 96, 64, 81, 128, 131, 3, 129, 95, 135, 90, 241, 21, 128, 21, 97, 9, 254, 87, 61, 95, 128, 62, 61, 95, 253, 91, 80, 80, 80, 80, 96, 64, 81, 61, 96, 31, 25, 96, 31, 130, 1, 22, 130, 1, 128, 96, 64, 82, 80, 129, 1, 144, 97, 10, 34, 145, 144, 97, 24, 207, 86, 91, 123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 20, 91, 97, 10, 130, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 10, 121, 144, 97, 25, 68, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 80, 80, 80, 86, 91, 95, 128, 95, 131, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 144, 84, 144, 97, 1, 0, 10, 144, 4, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 144, 80, 95, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 3, 97, 11, 40, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 11, 31, 144, 97, 22, 79, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 145, 144, 80, 86, 91, 95, 128, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 130, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 3, 97, 11, 156, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 11, 147, 144, 97, 25, 172, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 96, 1, 95, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 84, 144, 80, 145, 144, 80, 86, 91, 96, 96, 96, 64, 81, 128, 96, 64, 1, 96, 64, 82, 128, 96, 3, 129, 82, 96, 32, 1, 127, 84, 69, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 80, 144, 80, 144, 86, 91, 128, 96, 3, 95, 51, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 132, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 97, 1, 0, 10, 129, 84, 129, 96, 255, 2, 25, 22, 144, 131, 21, 21, 2, 23, 144, 85, 80, 129, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 51, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 127, 23, 48, 126, 171, 57, 171, 97, 7, 232, 137, 152, 69, 173, 61, 89, 189, 150, 83, 242, 0, 242, 32, 146, 4, 137, 202, 43, 89, 55, 105, 108, 49, 131, 96, 64, 81, 97, 13, 10, 145, 144, 97, 17, 246, 86, 91, 96, 64, 81, 128, 145, 3, 144, 163, 80, 80, 86, 91, 97, 13, 33, 133, 133, 133, 97, 6, 121, 86, 91, 95, 132, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 59, 20, 128, 97, 14, 10, 87, 80, 99, 21, 11, 122, 2, 96, 224, 27, 123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 132, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 99, 21, 11, 122, 2, 51, 136, 135, 135, 135, 96, 64, 81, 134, 99, 255, 255, 255, 255, 22, 96, 224, 27, 129, 82, 96, 4, 1, 97, 13, 169, 149, 148, 147, 146, 145, 144, 97, 26, 4, 86, 91, 96, 32, 96, 64, 81, 128, 131, 3, 129, 95, 135, 90, 241, 21, 128, 21, 97, 13, 197, 87, 61, 95, 128, 62, 61, 95, 253, 91, 80, 80, 80, 80, 96, 64, 81, 61, 96, 31, 25, 96, 31, 130, 1, 22, 130, 1, 128, 96, 64, 82, 80, 129, 1, 144, 97, 13, 233, 145, 144, 97, 24, 207, 86, 91, 123, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 20, 91, 97, 14, 73, 87, 96, 64, 81, 127, 8, 195, 121, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 4, 1, 97, 14, 64, 144, 97, 25, 68, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 80, 80, 80, 80, 80, 86, 91, 96, 96, 97, 14, 91, 130, 97, 15, 214, 86, 91, 96, 64, 81, 96, 32, 1, 97, 14, 107, 145, 144, 97, 26, 176, 86, 91, 96, 64, 81, 96, 32, 129, 131, 3, 3, 129, 82, 144, 96, 64, 82, 144, 80, 145, 144, 80, 86, 91, 96, 3, 96, 32, 82, 129, 95, 82, 96, 64, 95, 32, 96, 32, 82, 128, 95, 82, 96, 64, 95, 32, 95, 145, 80, 145, 80, 144, 84, 144, 97, 1, 0, 10, 144, 4, 96, 255, 22, 129, 86, 91, 95, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 20, 128, 97, 15, 103, 87, 80, 96, 3, 95, 133, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 132, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 144, 84, 144, 97, 1, 0, 10, 144, 4, 96, 255, 22, 91, 128, 97, 15, 205, 87, 80, 96, 2, 95, 131, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 95, 32, 95, 144, 84, 144, 97, 1, 0, 10, 144, 4, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 131, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 22, 20, 91, 144, 80, 147, 146, 80, 80, 80, 86, 91, 96, 96, 95, 130, 3, 97, 16, 28, 87, 96, 64, 81, 128, 96, 64, 1, 96, 64, 82, 128, 96, 1, 129, 82, 96, 32, 1, 127, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 80, 144, 80, 97, 17, 79, 86, 91, 95, 130, 144, 80, 95, 91, 95, 130, 20, 97, 16, 75, 87, 128, 128, 97, 16, 52, 144, 97, 23, 249, 86, 91, 145, 80, 80, 96, 10, 130, 97, 16, 68, 145, 144, 97, 27, 2, 86, 91, 145, 80, 97, 16, 34, 86, 91, 95, 129, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 16, 102, 87, 97, 16, 101, 97, 27, 50, 86, 91, 91, 96, 64, 81, 144, 128, 130, 82, 128, 96, 31, 1, 96, 31, 25, 22, 96, 32, 1, 130, 1, 96, 64, 82, 128, 21, 97, 16, 152, 87, 129, 96, 32, 1, 96, 1, 130, 2, 128, 54, 131, 55, 128, 130, 1, 145, 80, 80, 144, 80, 91, 80, 144, 80, 95, 130, 144, 80, 91, 95, 134, 20, 97, 17, 71, 87, 96, 1, 129, 97, 16, 180, 145, 144, 97, 27, 95, 86, 91, 144, 80, 95, 96, 10, 128, 136, 97, 16, 197, 145, 144, 97, 27, 2, 86, 91, 97, 16, 207, 145, 144, 97, 27, 146, 86, 91, 135, 97, 16, 218, 145, 144, 97, 27, 95, 86, 91, 96, 48, 97, 16, 230, 145, 144, 97, 27, 223, 86, 91, 144, 80, 95, 129, 96, 248, 27, 144, 80, 128, 132, 132, 129, 81, 129, 16, 97, 17, 3, 87, 97, 17, 2, 97, 28, 19, 86, 91, 91, 96, 32, 1, 1, 144, 126, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25, 22, 144, 129, 95, 26, 144, 83, 80, 96, 10, 136, 97, 17, 62, 145, 144, 97, 27, 2, 86, 91, 151, 80, 80, 80, 97, 16, 160, 86, 91, 129, 148, 80, 80, 80, 80, 80, 91, 145, 144, 80, 86, 91, 95, 128, 253, 91, 95, 128, 253, 91, 95, 127, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 22, 144, 80, 145, 144, 80, 86, 91, 97, 17, 144, 129, 97, 17, 92, 86, 91, 129, 20, 97, 17, 154, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 17, 171, 129, 97, 17, 135, 86, 91, 146, 145, 80, 80, 86, 91, 95, 96, 32, 130, 132, 3, 18, 21, 97, 17, 198, 87, 97, 17, 197, 97, 17, 84, 86, 91, 91, 95, 97, 17, 211, 132, 130, 133, 1, 97, 17, 157, 86, 91, 145, 80, 80, 146, 145, 80, 80, 86, 91, 95, 129, 21, 21, 144, 80, 145, 144, 80, 86, 91, 97, 17, 240, 129, 97, 17, 220, 86, 91, 130, 82, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 97, 18, 9, 95, 131, 1, 132, 97, 17, 231, 86, 91, 146, 145, 80, 80, 86, 91, 95, 129, 81, 144, 80, 145, 144, 80, 86, 91, 95, 130, 130, 82, 96, 32, 130, 1, 144, 80, 146, 145, 80, 80, 86, 91, 95, 91, 131, 129, 16, 21, 97, 18, 70, 87, 128, 130, 1, 81, 129, 132, 1, 82, 96, 32, 129, 1, 144, 80, 97, 18, 43, 86, 91, 95, 132, 132, 1, 82, 80, 80, 80, 80, 86, 91, 95, 96, 31, 25, 96, 31, 131, 1, 22, 144, 80, 145, 144, 80, 86, 91, 95, 97, 18, 107, 130, 97, 18, 15, 86, 91, 97, 18, 117, 129, 133, 97, 18, 25, 86, 91, 147, 80, 97, 18, 133, 129, 133, 96, 32, 134, 1, 97, 18, 41, 86, 91, 97, 18, 142, 129, 97, 18, 81, 86, 91, 132, 1, 145, 80, 80, 146, 145, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 18, 177, 129, 132, 97, 18, 97, 86, 91, 144, 80, 146, 145, 80, 80, 86, 91, 95, 129, 144, 80, 145, 144, 80, 86, 91, 97, 18, 203, 129, 97, 18, 185, 86, 91, 129, 20, 97, 18, 213, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 18, 230, 129, 97, 18, 194, 86, 91, 146, 145, 80, 80, 86, 91, 95, 96, 32, 130, 132, 3, 18, 21, 97, 19, 1, 87, 97, 19, 0, 97, 17, 84, 86, 91, 91, 95, 97, 19, 14, 132, 130, 133, 1, 97, 18, 216, 86, 91, 145, 80, 80, 146, 145, 80, 80, 86, 91, 95, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 130, 22, 144, 80, 145, 144, 80, 86, 91, 95, 97, 19, 64, 130, 97, 19, 23, 86, 91, 144, 80, 145, 144, 80, 86, 91, 97, 19, 80, 129, 97, 19, 54, 86, 91, 130, 82, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 97, 19, 105, 95, 131, 1, 132, 97, 19, 71, 86, 91, 146, 145, 80, 80, 86, 91, 97, 19, 120, 129, 97, 19, 54, 86, 91, 129, 20, 97, 19, 130, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 19, 147, 129, 97, 19, 111, 86, 91, 146, 145, 80, 80, 86, 91, 95, 128, 96, 64, 131, 133, 3, 18, 21, 97, 19, 175, 87, 97, 19, 174, 97, 17, 84, 86, 91, 91, 95, 97, 19, 188, 133, 130, 134, 1, 97, 19, 133, 86, 91, 146, 80, 80, 96, 32, 97, 19, 205, 133, 130, 134, 1, 97, 18, 216, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 91, 95, 128, 95, 96, 96, 132, 134, 3, 18, 21, 97, 19, 238, 87, 97, 19, 237, 97, 17, 84, 86, 91, 91, 95, 97, 19, 251, 134, 130, 135, 1, 97, 19, 133, 86, 91, 147, 80, 80, 96, 32, 97, 20, 12, 134, 130, 135, 1, 97, 19, 133, 86, 91, 146, 80, 80, 96, 64, 97, 20, 29, 134, 130, 135, 1, 97, 18, 216, 86, 91, 145, 80, 80, 146, 80, 146, 80, 146, 86, 91, 95, 96, 32, 130, 132, 3, 18, 21, 97, 20, 60, 87, 97, 20, 59, 97, 17, 84, 86, 91, 91, 95, 97, 20, 73, 132, 130, 133, 1, 97, 19, 133, 86, 91, 145, 80, 80, 146, 145, 80, 80, 86, 91, 97, 20, 91, 129, 97, 18, 185, 86, 91, 130, 82, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 97, 20, 116, 95, 131, 1, 132, 97, 20, 82, 86, 91, 146, 145, 80, 80, 86, 91, 97, 20, 131, 129, 97, 17, 220, 86, 91, 129, 20, 97, 20, 141, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 20, 158, 129, 97, 20, 122, 86, 91, 146, 145, 80, 80, 86, 91, 95, 128, 96, 64, 131, 133, 3, 18, 21, 97, 20, 186, 87, 97, 20, 185, 97, 17, 84, 86, 91, 91, 95, 97, 20, 199, 133, 130, 134, 1, 97, 19, 133, 86, 91, 146, 80, 80, 96, 32, 97, 20, 216, 133, 130, 134, 1, 97, 20, 144, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 91, 95, 128, 253, 91, 95, 128, 253, 91, 95, 128, 253, 91, 95, 128, 131, 96, 31, 132, 1, 18, 97, 21, 3, 87, 97, 21, 2, 97, 20, 226, 86, 91, 91, 130, 53, 144, 80, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 21, 32, 87, 97, 21, 31, 97, 20, 230, 86, 91, 91, 96, 32, 131, 1, 145, 80, 131, 96, 1, 130, 2, 131, 1, 17, 21, 97, 21, 60, 87, 97, 21, 59, 97, 20, 234, 86, 91, 91, 146, 80, 146, 144, 80, 86, 91, 95, 128, 95, 128, 95, 96, 128, 134, 136, 3, 18, 21, 97, 21, 92, 87, 97, 21, 91, 97, 17, 84, 86, 91, 91, 95, 97, 21, 105, 136, 130, 137, 1, 97, 19, 133, 86, 91, 149, 80, 80, 96, 32, 97, 21, 122, 136, 130, 137, 1, 97, 19, 133, 86, 91, 148, 80, 80, 96, 64, 97, 21, 139, 136, 130, 137, 1, 97, 18, 216, 86, 91, 147, 80, 80, 96, 96, 134, 1, 53, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 21, 172, 87, 97, 21, 171, 97, 17, 88, 86, 91, 91, 97, 21, 184, 136, 130, 137, 1, 97, 20, 238, 86, 91, 146, 80, 146, 80, 80, 146, 149, 80, 146, 149, 144, 147, 80, 86, 91, 95, 128, 96, 64, 131, 133, 3, 18, 21, 97, 21, 221, 87, 97, 21, 220, 97, 17, 84, 86, 91, 91, 95, 97, 21, 234, 133, 130, 134, 1, 97, 19, 133, 86, 91, 146, 80, 80, 96, 32, 97, 21, 251, 133, 130, 134, 1, 97, 19, 133, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 91, 127, 116, 111, 107, 101, 110, 32, 100, 111, 101, 115, 110, 39, 116, 32, 101, 120, 105, 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 130, 1, 82, 80, 86, 91, 95, 97, 22, 57, 96, 19, 131, 97, 18, 25, 86, 91, 145, 80, 97, 22, 68, 130, 97, 22, 5, 86, 91, 96, 32, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 22, 102, 129, 97, 22, 45, 86, 91, 144, 80, 145, 144, 80, 86, 91, 127, 110, 111, 116, 32, 97, 117, 116, 104, 111, 114, 105, 122, 101, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 130, 1, 82, 80, 86, 91, 95, 97, 22, 161, 96, 14, 131, 97, 18, 25, 86, 91, 145, 80, 97, 22, 172, 130, 97, 22, 109, 86, 91, 96, 32, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 22, 206, 129, 97, 22, 149, 86, 91, 144, 80, 145, 144, 80, 86, 91, 127, 102, 114, 111, 109, 32, 33, 61, 32, 111, 119, 110, 101, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 130, 1, 82, 80, 86, 91, 95, 97, 23, 9, 96, 13, 131, 97, 18, 25, 86, 91, 145, 80, 97, 23, 20, 130, 97, 22, 213, 86, 91, 96, 32, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 23, 54, 129, 97, 22, 253, 86, 91, 144, 80, 145, 144, 80, 86, 91, 127, 116, 114, 97, 110, 115, 102, 101, 114, 32, 116, 111, 32, 122, 101, 114, 111, 32, 97, 100, 100, 114, 101, 115, 115, 0, 0, 0, 0, 0, 0, 0, 0, 95, 130, 1, 82, 80, 86, 91, 95, 97, 23, 113, 96, 24, 131, 97, 18, 25, 86, 91, 145, 80, 97, 23, 124, 130, 97, 23, 61, 86, 91, 96, 32, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 23, 158, 129, 97, 23, 101, 86, 91, 144, 80, 145, 144, 80, 86, 91, 127, 78, 72, 123, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 82, 96, 17, 96, 4, 82, 96, 36, 95, 253, 91, 95, 97, 23, 220, 130, 97, 18, 185, 86, 91, 145, 80, 95, 130, 3, 97, 23, 238, 87, 97, 23, 237, 97, 23, 165, 86, 91, 91, 96, 1, 130, 3, 144, 80, 145, 144, 80, 86, 91, 95, 97, 24, 3, 130, 97, 18, 185, 86, 91, 145, 80, 127, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 130, 3, 97, 24, 53, 87, 97, 24, 52, 97, 23, 165, 86, 91, 91, 96, 1, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 130, 130, 82, 96, 32, 130, 1, 144, 80, 146, 145, 80, 80, 86, 91, 80, 86, 91, 95, 97, 24, 94, 95, 131, 97, 24, 64, 86, 91, 145, 80, 97, 24, 105, 130, 97, 24, 80, 86, 91, 95, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 96, 128, 130, 1, 144, 80, 97, 24, 134, 95, 131, 1, 134, 97, 19, 71, 86, 91, 97, 24, 147, 96, 32, 131, 1, 133, 97, 19, 71, 86, 91, 97, 24, 160, 96, 64, 131, 1, 132, 97, 20, 82, 86, 91, 129, 129, 3, 96, 96, 131, 1, 82, 97, 24, 177, 129, 97, 24, 83, 86, 91, 144, 80, 148, 147, 80, 80, 80, 80, 86, 91, 95, 129, 81, 144, 80, 97, 24, 201, 129, 97, 17, 135, 86, 91, 146, 145, 80, 80, 86, 91, 95, 96, 32, 130, 132, 3, 18, 21, 97, 24, 228, 87, 97, 24, 227, 97, 17, 84, 86, 91, 91, 95, 97, 24, 241, 132, 130, 133, 1, 97, 24, 187, 86, 91, 145, 80, 80, 146, 145, 80, 80, 86, 91, 127, 117, 110, 115, 97, 102, 101, 32, 114, 101, 99, 105, 112, 105, 101, 110, 116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 130, 1, 82, 80, 86, 91, 95, 97, 25, 46, 96, 16, 131, 97, 18, 25, 86, 91, 145, 80, 97, 25, 57, 130, 97, 24, 250, 86, 91, 96, 32, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 25, 91, 129, 97, 25, 34, 86, 91, 144, 80, 145, 144, 80, 86, 91, 127, 111, 119, 110, 101, 114, 32, 61, 32, 122, 101, 114, 111, 32, 97, 100, 100, 114, 101, 115, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 130, 1, 82, 80, 86, 91, 95, 97, 25, 150, 96, 20, 131, 97, 18, 25, 86, 91, 145, 80, 97, 25, 161, 130, 97, 25, 98, 86, 91, 96, 32, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 25, 195, 129, 97, 25, 138, 86, 91, 144, 80, 145, 144, 80, 86, 91, 130, 129, 131, 55, 95, 131, 131, 1, 82, 80, 80, 80, 86, 91, 95, 97, 25, 227, 131, 133, 97, 24, 64, 86, 91, 147, 80, 97, 25, 240, 131, 133, 132, 97, 25, 202, 86, 91, 97, 25, 249, 131, 97, 18, 81, 86, 91, 132, 1, 144, 80, 147, 146, 80, 80, 80, 86, 91, 95, 96, 128, 130, 1, 144, 80, 97, 26, 23, 95, 131, 1, 136, 97, 19, 71, 86, 91, 97, 26, 36, 96, 32, 131, 1, 135, 97, 19, 71, 86, 91, 97, 26, 49, 96, 64, 131, 1, 134, 97, 20, 82, 86, 91, 129, 129, 3, 96, 96, 131, 1, 82, 97, 26, 68, 129, 132, 134, 97, 25, 216, 86, 91, 144, 80, 150, 149, 80, 80, 80, 80, 80, 80, 86, 91, 127, 104, 116, 116, 112, 115, 58, 47, 47, 101, 120, 97, 109, 112, 108, 101, 46, 99, 111, 109, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 80, 86, 91, 95, 129, 144, 80, 146, 145, 80, 80, 86, 91, 95, 97, 26, 138, 130, 97, 18, 15, 86, 91, 97, 26, 148, 129, 133, 97, 26, 118, 86, 91, 147, 80, 97, 26, 164, 129, 133, 96, 32, 134, 1, 97, 18, 41, 86, 91, 128, 132, 1, 145, 80, 80, 146, 145, 80, 80, 86, 91, 95, 97, 26, 186, 130, 97, 26, 80, 86, 91, 96, 20, 130, 1, 145, 80, 97, 26, 202, 130, 132, 97, 26, 128, 86, 91, 145, 80, 129, 144, 80, 146, 145, 80, 80, 86, 91, 127, 78, 72, 123, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 82, 96, 18, 96, 4, 82, 96, 36, 95, 253, 91, 95, 97, 27, 12, 130, 97, 18, 185, 86, 91, 145, 80, 97, 27, 23, 131, 97, 18, 185, 86, 91, 146, 80, 130, 97, 27, 39, 87, 97, 27, 38, 97, 26, 213, 86, 91, 91, 130, 130, 4, 144, 80, 146, 145, 80, 80, 86, 91, 127, 78, 72, 123, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 82, 96, 65, 96, 4, 82, 96, 36, 95, 253, 91, 95, 97, 27, 105, 130, 97, 18, 185, 86, 91, 145, 80, 97, 27, 116, 131, 97, 18, 185, 86, 91, 146, 80, 130, 130, 3, 144, 80, 129, 129, 17, 21, 97, 27, 140, 87, 97, 27, 139, 97, 23, 165, 86, 91, 91, 146, 145, 80, 80, 86, 91, 95, 97, 27, 156, 130, 97, 18, 185, 86, 91, 145, 80, 97, 27, 167, 131, 97, 18, 185, 86, 91, 146, 80, 130, 130, 2, 97, 27, 181, 129, 97, 18, 185, 86, 91, 145, 80, 130, 130, 4, 132, 20, 131, 21, 23, 97, 27, 204, 87, 97, 27, 203, 97, 23, 165, 86, 91, 91, 80, 146, 145, 80, 80, 86, 91, 95, 96, 255, 130, 22, 144, 80, 145, 144, 80, 86, 91, 95, 97, 27, 233, 130, 97, 27, 211, 86, 91, 145, 80, 97, 27, 244, 131, 97, 27, 211, 86, 91, 146, 80, 130, 130, 1, 144, 80, 96, 255, 129, 17, 21, 97, 28, 13, 87, 97, 28, 12, 97, 23, 165, 86, 91, 91, 146, 145, 80, 80, 86, 91, 127, 78, 72, 123, 113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 82, 96, 50, 96, 4, 82, 96, 36, 95, 253, 254, 162, 100, 105, 112, 102, 115, 88, 34, 18, 32, 152, 17, 252, 33, 148, 72, 1, 112, 229, 152, 121, 145, 96, 180, 163, 194, 162, 156, 32, 193, 68, 101, 246, 14, 74, 226, 43, 102, 172, 20, 137, 30, 100, 115, 111, 108, 99, 67, 0, 8, 21, 0, 51}) + testERC1155ContractBytecode = ByteCode([]byte{96, 128, 96, 64, 82, 52, 128, 21, 97, 0, 15, 87, 95, 128, 253, 91, 80, 96, 4, 54, 16, 97, 0, 95, 87, 95, 53, 96, 224, 28, 128, 98, 253, 213, 142, 20, 97, 0, 99, 87, 128, 99, 46, 178, 194, 214, 20, 97, 0, 147, 87, 128, 99, 78, 18, 115, 244, 20, 97, 0, 175, 87, 128, 99, 162, 44, 180, 101, 20, 97, 0, 223, 87, 128, 99, 233, 133, 233, 197, 20, 97, 0, 251, 87, 128, 99, 242, 66, 67, 42, 20, 97, 1, 43, 87, 91, 95, 128, 253, 91, 97, 0, 125, 96, 4, 128, 54, 3, 129, 1, 144, 97, 0, 120, 145, 144, 97, 2, 10, 86, 91, 97, 1, 71, 86, 91, 96, 64, 81, 97, 0, 138, 145, 144, 97, 2, 87, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 0, 173, 96, 4, 128, 54, 3, 129, 1, 144, 97, 0, 168, 145, 144, 97, 3, 38, 86, 91, 97, 1, 78, 86, 91, 0, 91, 97, 0, 201, 96, 4, 128, 54, 3, 129, 1, 144, 97, 0, 196, 145, 144, 97, 4, 82, 86, 91, 97, 1, 88, 86, 91, 96, 64, 81, 97, 0, 214, 145, 144, 97, 5, 135, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 0, 249, 96, 4, 128, 54, 3, 129, 1, 144, 97, 0, 244, 145, 144, 97, 5, 220, 86, 91, 97, 1, 98, 86, 91, 0, 91, 97, 1, 21, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 16, 145, 144, 97, 6, 26, 86, 91, 97, 1, 102, 86, 91, 96, 64, 81, 97, 1, 34, 145, 144, 97, 6, 103, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 1, 69, 96, 4, 128, 54, 3, 129, 1, 144, 97, 1, 64, 145, 144, 97, 6, 128, 86, 91, 97, 1, 109, 86, 91, 0, 91, 95, 146, 145, 80, 80, 86, 91, 80, 80, 80, 80, 80, 80, 80, 80, 86, 91, 96, 96, 148, 147, 80, 80, 80, 80, 86, 91, 80, 80, 86, 91, 95, 146, 145, 80, 80, 86, 91, 80, 80, 80, 80, 80, 80, 86, 91, 95, 128, 253, 91, 95, 128, 253, 91, 95, 115, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 130, 22, 144, 80, 145, 144, 80, 86, 91, 95, 97, 1, 166, 130, 97, 1, 125, 86, 91, 144, 80, 145, 144, 80, 86, 91, 97, 1, 182, 129, 97, 1, 156, 86, 91, 129, 20, 97, 1, 192, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 1, 209, 129, 97, 1, 173, 86, 91, 146, 145, 80, 80, 86, 91, 95, 129, 144, 80, 145, 144, 80, 86, 91, 97, 1, 233, 129, 97, 1, 215, 86, 91, 129, 20, 97, 1, 243, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 2, 4, 129, 97, 1, 224, 86, 91, 146, 145, 80, 80, 86, 91, 95, 128, 96, 64, 131, 133, 3, 18, 21, 97, 2, 32, 87, 97, 2, 31, 97, 1, 117, 86, 91, 91, 95, 97, 2, 45, 133, 130, 134, 1, 97, 1, 195, 86, 91, 146, 80, 80, 96, 32, 97, 2, 62, 133, 130, 134, 1, 97, 1, 246, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 91, 97, 2, 81, 129, 97, 1, 215, 86, 91, 130, 82, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 97, 2, 106, 95, 131, 1, 132, 97, 2, 72, 86, 91, 146, 145, 80, 80, 86, 91, 95, 128, 253, 91, 95, 128, 253, 91, 95, 128, 253, 91, 95, 128, 131, 96, 31, 132, 1, 18, 97, 2, 145, 87, 97, 2, 144, 97, 2, 112, 86, 91, 91, 130, 53, 144, 80, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 2, 174, 87, 97, 2, 173, 97, 2, 116, 86, 91, 91, 96, 32, 131, 1, 145, 80, 131, 96, 32, 130, 2, 131, 1, 17, 21, 97, 2, 202, 87, 97, 2, 201, 97, 2, 120, 86, 91, 91, 146, 80, 146, 144, 80, 86, 91, 95, 128, 131, 96, 31, 132, 1, 18, 97, 2, 230, 87, 97, 2, 229, 97, 2, 112, 86, 91, 91, 130, 53, 144, 80, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 3, 3, 87, 97, 3, 2, 97, 2, 116, 86, 91, 91, 96, 32, 131, 1, 145, 80, 131, 96, 1, 130, 2, 131, 1, 17, 21, 97, 3, 31, 87, 97, 3, 30, 97, 2, 120, 86, 91, 91, 146, 80, 146, 144, 80, 86, 91, 95, 128, 95, 128, 95, 128, 95, 128, 96, 160, 137, 139, 3, 18, 21, 97, 3, 66, 87, 97, 3, 65, 97, 1, 117, 86, 91, 91, 95, 97, 3, 79, 139, 130, 140, 1, 97, 1, 195, 86, 91, 152, 80, 80, 96, 32, 97, 3, 96, 139, 130, 140, 1, 97, 1, 195, 86, 91, 151, 80, 80, 96, 64, 137, 1, 53, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 3, 129, 87, 97, 3, 128, 97, 1, 121, 86, 91, 91, 97, 3, 141, 139, 130, 140, 1, 97, 2, 124, 86, 91, 150, 80, 150, 80, 80, 96, 96, 137, 1, 53, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 3, 176, 87, 97, 3, 175, 97, 1, 121, 86, 91, 91, 97, 3, 188, 139, 130, 140, 1, 97, 2, 124, 86, 91, 148, 80, 148, 80, 80, 96, 128, 137, 1, 53, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 3, 223, 87, 97, 3, 222, 97, 1, 121, 86, 91, 91, 97, 3, 235, 139, 130, 140, 1, 97, 2, 209, 86, 91, 146, 80, 146, 80, 80, 146, 149, 152, 80, 146, 149, 152, 144, 147, 150, 80, 86, 91, 95, 128, 131, 96, 31, 132, 1, 18, 97, 4, 18, 87, 97, 4, 17, 97, 2, 112, 86, 91, 91, 130, 53, 144, 80, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 4, 47, 87, 97, 4, 46, 97, 2, 116, 86, 91, 91, 96, 32, 131, 1, 145, 80, 131, 96, 32, 130, 2, 131, 1, 17, 21, 97, 4, 75, 87, 97, 4, 74, 97, 2, 120, 86, 91, 91, 146, 80, 146, 144, 80, 86, 91, 95, 128, 95, 128, 96, 64, 133, 135, 3, 18, 21, 97, 4, 106, 87, 97, 4, 105, 97, 1, 117, 86, 91, 91, 95, 133, 1, 53, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 4, 135, 87, 97, 4, 134, 97, 1, 121, 86, 91, 91, 97, 4, 147, 135, 130, 136, 1, 97, 3, 253, 86, 91, 148, 80, 148, 80, 80, 96, 32, 133, 1, 53, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 4, 182, 87, 97, 4, 181, 97, 1, 121, 86, 91, 91, 97, 4, 194, 135, 130, 136, 1, 97, 2, 124, 86, 91, 146, 80, 146, 80, 80, 146, 149, 145, 148, 80, 146, 80, 86, 91, 95, 129, 81, 144, 80, 145, 144, 80, 86, 91, 95, 130, 130, 82, 96, 32, 130, 1, 144, 80, 146, 145, 80, 80, 86, 91, 95, 129, 144, 80, 96, 32, 130, 1, 144, 80, 145, 144, 80, 86, 91, 97, 5, 2, 129, 97, 1, 215, 86, 91, 130, 82, 80, 80, 86, 91, 95, 97, 5, 19, 131, 131, 97, 4, 249, 86, 91, 96, 32, 131, 1, 144, 80, 146, 145, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 145, 144, 80, 86, 91, 95, 97, 5, 53, 130, 97, 4, 208, 86, 91, 97, 5, 63, 129, 133, 97, 4, 218, 86, 91, 147, 80, 97, 5, 74, 131, 97, 4, 234, 86, 91, 128, 95, 91, 131, 129, 16, 21, 97, 5, 122, 87, 129, 81, 97, 5, 97, 136, 130, 97, 5, 8, 86, 91, 151, 80, 97, 5, 108, 131, 97, 5, 31, 86, 91, 146, 80, 80, 96, 1, 129, 1, 144, 80, 97, 5, 77, 86, 91, 80, 133, 147, 80, 80, 80, 80, 146, 145, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 129, 129, 3, 95, 131, 1, 82, 97, 5, 159, 129, 132, 97, 5, 43, 86, 91, 144, 80, 146, 145, 80, 80, 86, 91, 95, 129, 21, 21, 144, 80, 145, 144, 80, 86, 91, 97, 5, 187, 129, 97, 5, 167, 86, 91, 129, 20, 97, 5, 197, 87, 95, 128, 253, 91, 80, 86, 91, 95, 129, 53, 144, 80, 97, 5, 214, 129, 97, 5, 178, 86, 91, 146, 145, 80, 80, 86, 91, 95, 128, 96, 64, 131, 133, 3, 18, 21, 97, 5, 242, 87, 97, 5, 241, 97, 1, 117, 86, 91, 91, 95, 97, 5, 255, 133, 130, 134, 1, 97, 1, 195, 86, 91, 146, 80, 80, 96, 32, 97, 6, 16, 133, 130, 134, 1, 97, 5, 200, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 91, 95, 128, 96, 64, 131, 133, 3, 18, 21, 97, 6, 48, 87, 97, 6, 47, 97, 1, 117, 86, 91, 91, 95, 97, 6, 61, 133, 130, 134, 1, 97, 1, 195, 86, 91, 146, 80, 80, 96, 32, 97, 6, 78, 133, 130, 134, 1, 97, 1, 195, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 91, 97, 6, 97, 129, 97, 5, 167, 86, 91, 130, 82, 80, 80, 86, 91, 95, 96, 32, 130, 1, 144, 80, 97, 6, 122, 95, 131, 1, 132, 97, 6, 88, 86, 91, 146, 145, 80, 80, 86, 91, 95, 128, 95, 128, 95, 128, 96, 160, 135, 137, 3, 18, 21, 97, 6, 154, 87, 97, 6, 153, 97, 1, 117, 86, 91, 91, 95, 97, 6, 167, 137, 130, 138, 1, 97, 1, 195, 86, 91, 150, 80, 80, 96, 32, 97, 6, 184, 137, 130, 138, 1, 97, 1, 195, 86, 91, 149, 80, 80, 96, 64, 97, 6, 201, 137, 130, 138, 1, 97, 1, 246, 86, 91, 148, 80, 80, 96, 96, 97, 6, 218, 137, 130, 138, 1, 97, 1, 246, 86, 91, 147, 80, 80, 96, 128, 135, 1, 53, 103, 255, 255, 255, 255, 255, 255, 255, 255, 129, 17, 21, 97, 6, 251, 87, 97, 6, 250, 97, 1, 121, 86, 91, 91, 97, 7, 7, 137, 130, 138, 1, 97, 2, 209, 86, 91, 146, 80, 146, 80, 80, 146, 149, 80, 146, 149, 80, 146, 149, 86, 254, 162, 100, 105, 112, 102, 115, 88, 34, 18, 32, 148, 159, 178, 116, 208, 174, 11, 170, 125, 189, 81, 142, 193, 10, 233, 27, 120, 223, 28, 202, 63, 46, 164, 30, 109, 18, 61, 127, 117, 110, 98, 132, 100, 115, 111, 108, 99, 67, 0, 8, 21, 0, 51}) // testERC1155RealWorldBytecode is taken from https://etherscan.io/token/0x76be3b62873462d2142405439777e971754e8e77#code - testERC1155RealWorldBytecode = Bytecode([]byte{96, 128, 96, 64, 82, 52, 128, 21, 97, 0, 16, 87, 96, 0, 128, 253, 91, 80, 96, 4, 54, 16, 97, 1, 195, 87, 96, 0, 53, 96, 224, 28, 128, 99, 149, 216, 155, 65, 17, 97, 0, 249, 87, 128, 99, 229, 200, 176, 61, 17, 97, 0, 151, 87, 128, 99, 235, 18, 214, 30, 17, 97, 0, 113, 87, 128, 99, 235, 18, 214, 30, 20, 97, 3, 159, 87, 128, 99, 242, 66, 67, 42, 20, 97, 3, 178, 87, 128, 99, 242, 253, 227, 139, 20, 97, 3, 197, 87, 128, 99, 245, 41, 138, 202, 20, 97, 3, 216, 87, 97, 1, 195, 86, 91, 128, 99, 229, 200, 176, 61, 20, 97, 3, 124, 87, 128, 99, 232, 163, 212, 133, 20, 97, 3, 132, 87, 128, 99, 233, 133, 233, 197, 20, 97, 3, 140, 87, 97, 1, 195, 86, 91, 128, 99, 185, 196, 217, 251, 17, 97, 0, 211, 87, 128, 99, 185, 196, 217, 251, 20, 97, 3, 46, 87, 128, 99, 192, 172, 153, 131, 20, 97, 3, 78, 87, 128, 99, 198, 191, 50, 98, 20, 97, 3, 86, 87, 128, 99, 205, 83, 208, 142, 20, 97, 3, 105, 87, 97, 1, 195, 86, 91, 128, 99, 149, 216, 155, 65, 20, 97, 3, 0, 87, 128, 99, 153, 224, 221, 124, 20, 97, 3, 8, 87, 128, 99, 162, 44, 180, 101, 20, 97, 3, 27, 87, 97, 1, 195, 86, 91, 128, 99, 78, 18, 115, 244, 17, 97, 1, 102, 87, 128, 99, 125, 247, 62, 39, 17, 97, 1, 64, 87, 128, 99, 125, 247, 62, 39, 20, 97, 2, 189, 87, 128, 99, 141, 165, 203, 91, 20, 97, 2, 208, 87, 128, 99, 143, 50, 213, 155, 20, 97, 2, 229, 87, 128, 99, 147, 142, 61, 123, 20, 97, 2, 237, 87, 97, 1, 195, 86, 91, 128, 99, 78, 18, 115, 244, 20, 97, 2, 129, 87, 128, 99, 99, 8, 241, 205, 20, 97, 2, 148, 87, 128, 99, 113, 80, 24, 166, 20, 97, 2, 181, 87, 97, 1, 195, 86, 91, 128, 99, 14, 49, 106, 183, 17, 97, 1, 162, 87, 128, 99, 14, 49, 106, 183, 20, 97, 2, 38, 87, 128, 99, 14, 137, 52, 28, 20, 97, 2, 59, 87, 128, 99, 14, 189, 76, 127, 20, 97, 2, 78, 87, 128, 99, 46, 178, 194, 214, 20, 97, 2, 110, 87, 97, 1, 195, 86, 91, 128, 98, 253, 213, 142, 20, 97, 1, 200, 87, 128, 99, 1, 255, 201, 167, 20, 97, 1, 241, 87, 128, 99, 6, 253, 222, 3, 20, 97, 2, 17, 87, 91, 96, 0, 128, 253, 91, 97, 1, 219, 97, 1, 214, 54, 96, 4, 97, 31, 231, 86, 91, 97, 3, 235, 86, 91, 96, 64, 81, 97, 1, 232, 145, 144, 97, 43, 219, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 2, 4, 97, 1, 255, 54, 96, 4, 97, 32, 210, 86, 91, 97, 4, 21, 86, 91, 96, 64, 81, 97, 1, 232, 145, 144, 97, 42, 78, 86, 91, 97, 2, 25, 97, 4, 52, 86, 91, 96, 64, 81, 97, 1, 232, 145, 144, 97, 42, 154, 86, 91, 97, 2, 57, 97, 2, 52, 54, 96, 4, 97, 30, 9, 86, 91, 97, 4, 194, 86, 91, 0, 91, 97, 2, 25, 97, 2, 73, 54, 96, 4, 97, 33, 66, 86, 91, 97, 4, 251, 86, 91, 97, 2, 97, 97, 2, 92, 54, 96, 4, 97, 33, 66, 86, 91, 97, 5, 6, 86, 91, 96, 64, 81, 97, 1, 232, 145, 144, 97, 42, 61, 86, 91, 97, 2, 57, 97, 2, 124, 54, 96, 4, 97, 30, 97, 86, 91, 97, 5, 249, 86, 91, 97, 2, 97, 97, 2, 143, 54, 96, 4, 97, 32, 100, 86, 91, 97, 8, 239, 86, 91, 97, 2, 167, 97, 2, 162, 54, 96, 4, 97, 33, 96, 86, 91, 97, 9, 201, 86, 91, 96, 64, 81, 97, 1, 232, 146, 145, 144, 97, 41, 50, 86, 91, 97, 2, 57, 97, 10, 12, 86, 91, 97, 2, 4, 97, 2, 203, 54, 96, 4, 97, 30, 9, 86, 91, 97, 10, 122, 86, 91, 97, 2, 216, 97, 10, 141, 86, 91, 96, 64, 81, 97, 1, 232, 145, 144, 97, 41, 36, 86, 91, 97, 2, 4, 97, 10, 157, 86, 91, 97, 2, 57, 97, 2, 251, 54, 96, 4, 97, 33, 14, 86, 91, 97, 10, 195, 86, 91, 97, 2, 25, 97, 10, 240, 86, 91, 97, 2, 57, 97, 3, 22, 54, 96, 4, 97, 33, 14, 86, 91, 97, 11, 75, 86, 91, 97, 2, 57, 97, 3, 41, 54, 96, 4, 97, 31, 183, 86, 91, 97, 11, 120, 86, 91, 97, 3, 65, 97, 3, 60, 54, 96, 4, 97, 33, 66, 86, 91, 97, 11, 231, 86, 91, 96, 64, 81, 97, 1, 232, 145, 144, 97, 41, 251, 86, 91, 97, 2, 25, 97, 12, 223, 86, 91, 97, 2, 57, 97, 3, 100, 54, 96, 4, 97, 33, 127, 86, 91, 97, 13, 58, 86, 91, 97, 2, 216, 97, 3, 119, 54, 96, 4, 97, 33, 66, 86, 91, 97, 13, 118, 86, 91, 97, 2, 57, 97, 13, 145, 86, 91, 97, 2, 25, 97, 13, 163, 86, 91, 97, 2, 4, 97, 3, 154, 54, 96, 4, 97, 30, 39, 86, 91, 97, 13, 254, 86, 91, 97, 2, 57, 97, 3, 173, 54, 96, 4, 97, 30, 9, 86, 91, 97, 14, 44, 86, 91, 97, 2, 57, 97, 3, 192, 54, 96, 4, 97, 31, 40, 86, 91, 97, 14, 89, 86, 91, 97, 2, 57, 97, 3, 211, 54, 96, 4, 97, 30, 9, 86, 91, 97, 16, 19, 86, 91, 97, 2, 57, 97, 3, 230, 54, 96, 4, 97, 32, 23, 86, 91, 97, 16, 64, 86, 91, 96, 0, 129, 129, 82, 96, 6, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 96, 1, 96, 1, 96, 160, 27, 3, 134, 22, 132, 82, 144, 145, 82, 144, 32, 84, 91, 146, 145, 80, 80, 86, 91, 96, 1, 96, 1, 96, 224, 27, 3, 25, 22, 96, 0, 144, 129, 82, 96, 32, 129, 144, 82, 96, 64, 144, 32, 84, 96, 255, 22, 144, 86, 91, 96, 10, 128, 84, 96, 64, 128, 81, 96, 32, 96, 2, 96, 1, 133, 22, 21, 97, 1, 0, 2, 96, 0, 25, 1, 144, 148, 22, 147, 144, 147, 4, 96, 31, 129, 1, 132, 144, 4, 132, 2, 130, 1, 132, 1, 144, 146, 82, 129, 129, 82, 146, 145, 131, 1, 130, 130, 128, 21, 97, 4, 186, 87, 128, 96, 31, 16, 97, 4, 143, 87, 97, 1, 0, 128, 131, 84, 4, 2, 131, 82, 145, 96, 32, 1, 145, 97, 4, 186, 86, 91, 130, 1, 145, 144, 96, 0, 82, 96, 32, 96, 0, 32, 144, 91, 129, 84, 129, 82, 144, 96, 1, 1, 144, 96, 32, 1, 128, 131, 17, 97, 4, 157, 87, 130, 144, 3, 96, 31, 22, 130, 1, 145, 91, 80, 80, 80, 80, 80, 129, 86, 91, 97, 4, 202, 97, 10, 157, 86, 91, 97, 4, 239, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 59, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 97, 4, 248, 129, 97, 17, 56, 86, 91, 80, 86, 91, 96, 96, 97, 4, 15, 130, 97, 17, 128, 86, 91, 96, 0, 129, 129, 82, 96, 9, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 128, 84, 130, 81, 129, 133, 2, 129, 1, 133, 1, 144, 147, 82, 128, 131, 82, 96, 96, 148, 133, 148, 132, 1, 91, 130, 130, 16, 21, 97, 5, 120, 87, 96, 0, 132, 129, 82, 96, 32, 144, 129, 144, 32, 96, 64, 128, 81, 128, 130, 1, 144, 145, 82, 96, 2, 133, 2, 144, 145, 1, 128, 84, 96, 1, 96, 1, 96, 160, 27, 3, 22, 130, 82, 96, 1, 144, 129, 1, 84, 130, 132, 1, 82, 144, 131, 82, 144, 146, 1, 145, 1, 97, 5, 48, 86, 91, 80, 80, 80, 80, 144, 80, 96, 96, 129, 81, 96, 64, 81, 144, 128, 130, 82, 128, 96, 32, 2, 96, 32, 1, 130, 1, 96, 64, 82, 128, 21, 97, 5, 171, 87, 129, 96, 32, 1, 96, 32, 130, 2, 128, 56, 131, 57, 1, 144, 80, 91, 80, 144, 80, 96, 0, 91, 130, 81, 129, 16, 21, 97, 5, 241, 87, 130, 129, 129, 81, 129, 16, 97, 5, 198, 87, 254, 91, 96, 32, 2, 96, 32, 1, 1, 81, 96, 32, 1, 81, 130, 130, 129, 81, 129, 16, 97, 5, 222, 87, 254, 91, 96, 32, 144, 129, 2, 145, 144, 145, 1, 1, 82, 96, 1, 1, 97, 5, 177, 86, 91, 80, 147, 146, 80, 80, 80, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 135, 22, 97, 6, 31, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 42, 235, 86, 91, 132, 131, 20, 97, 6, 62, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 123, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 136, 22, 51, 20, 128, 97, 6, 125, 87, 80, 96, 1, 96, 1, 96, 160, 27, 3, 136, 22, 96, 0, 144, 129, 82, 96, 7, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 51, 132, 82, 144, 145, 82, 144, 32, 84, 96, 255, 22, 21, 21, 96, 1, 20, 91, 97, 6, 153, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 27, 86, 91, 96, 0, 91, 133, 129, 16, 21, 97, 7, 206, 87, 96, 0, 135, 135, 131, 129, 129, 16, 97, 6, 178, 87, 254, 91, 144, 80, 96, 32, 2, 1, 53, 144, 80, 96, 0, 134, 134, 132, 129, 129, 16, 97, 6, 201, 87, 254, 91, 144, 80, 96, 32, 2, 1, 53, 144, 80, 97, 7, 27, 129, 96, 6, 96, 0, 133, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 96, 0, 32, 96, 0, 142, 96, 1, 96, 1, 96, 160, 27, 3, 22, 96, 1, 96, 1, 96, 160, 27, 3, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 96, 0, 32, 84, 97, 18, 187, 144, 145, 144, 99, 255, 255, 255, 255, 22, 86, 91, 96, 6, 96, 0, 132, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 96, 0, 32, 96, 0, 141, 96, 1, 96, 1, 96, 160, 27, 3, 22, 96, 1, 96, 1, 96, 160, 27, 3, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 96, 0, 32, 129, 144, 85, 80, 97, 7, 158, 96, 6, 96, 0, 132, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 96, 0, 32, 96, 0, 140, 96, 1, 96, 1, 96, 160, 27, 3, 22, 96, 1, 96, 1, 96, 160, 27, 3, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 96, 0, 32, 84, 130, 97, 18, 205, 144, 145, 144, 99, 255, 255, 255, 255, 22, 86, 91, 96, 0, 146, 131, 82, 96, 6, 96, 32, 144, 129, 82, 96, 64, 128, 133, 32, 96, 1, 96, 1, 96, 160, 27, 3, 142, 22, 134, 82, 144, 145, 82, 144, 146, 32, 145, 144, 145, 85, 80, 96, 1, 1, 97, 6, 156, 86, 91, 80, 134, 96, 1, 96, 1, 96, 160, 27, 3, 22, 136, 96, 1, 96, 1, 96, 160, 27, 3, 22, 51, 96, 1, 96, 1, 96, 160, 27, 3, 22, 127, 74, 57, 220, 6, 212, 192, 219, 198, 75, 112, 175, 144, 253, 105, 138, 35, 58, 81, 138, 165, 208, 126, 89, 93, 152, 59, 140, 5, 38, 200, 247, 251, 137, 137, 137, 137, 96, 64, 81, 97, 8, 34, 148, 147, 146, 145, 144, 97, 42, 12, 86, 91, 96, 64, 81, 128, 145, 3, 144, 164, 97, 8, 60, 135, 96, 1, 96, 1, 96, 160, 27, 3, 22, 97, 18, 218, 86, 91, 21, 97, 8, 229, 87, 97, 8, 229, 51, 137, 137, 137, 137, 128, 128, 96, 32, 2, 96, 32, 1, 96, 64, 81, 144, 129, 1, 96, 64, 82, 128, 147, 146, 145, 144, 129, 129, 82, 96, 32, 1, 131, 131, 96, 32, 2, 128, 130, 132, 55, 96, 0, 146, 1, 145, 144, 145, 82, 80, 80, 96, 64, 128, 81, 96, 32, 128, 141, 2, 130, 129, 1, 130, 1, 144, 147, 82, 140, 130, 82, 144, 147, 80, 140, 146, 80, 139, 145, 130, 145, 133, 1, 144, 132, 144, 128, 130, 132, 55, 96, 0, 146, 1, 145, 144, 145, 82, 80, 80, 96, 64, 128, 81, 96, 32, 96, 31, 140, 1, 129, 144, 4, 129, 2, 130, 1, 129, 1, 144, 146, 82, 138, 129, 82, 146, 80, 138, 145, 80, 137, 144, 129, 144, 132, 1, 131, 130, 128, 130, 132, 55, 96, 0, 146, 1, 145, 144, 145, 82, 80, 97, 19, 22, 146, 80, 80, 80, 86, 91, 80, 80, 80, 80, 80, 80, 80, 80, 86, 91, 96, 96, 131, 130, 20, 97, 8, 253, 87, 96, 0, 128, 253, 91, 96, 64, 128, 81, 133, 129, 82, 96, 32, 128, 135, 2, 130, 1, 1, 144, 145, 82, 96, 96, 144, 133, 128, 21, 97, 9, 41, 87, 129, 96, 32, 1, 96, 32, 130, 2, 128, 56, 131, 57, 1, 144, 80, 91, 80, 144, 80, 96, 0, 91, 133, 129, 16, 21, 97, 9, 191, 87, 96, 6, 96, 0, 134, 134, 132, 129, 129, 16, 97, 9, 71, 87, 254, 91, 144, 80, 96, 32, 2, 1, 53, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 96, 0, 32, 96, 0, 136, 136, 132, 129, 129, 16, 97, 9, 106, 87, 254, 91, 144, 80, 96, 32, 2, 1, 96, 32, 97, 9, 127, 145, 144, 129, 1, 144, 97, 30, 9, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 22, 96, 1, 96, 1, 96, 160, 27, 3, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 96, 0, 32, 84, 130, 130, 129, 81, 129, 16, 97, 9, 172, 87, 254, 91, 96, 32, 144, 129, 2, 145, 144, 145, 1, 1, 82, 96, 1, 1, 97, 9, 47, 86, 91, 80, 149, 148, 80, 80, 80, 80, 80, 86, 91, 96, 9, 96, 32, 82, 129, 96, 0, 82, 96, 64, 96, 0, 32, 129, 129, 84, 129, 16, 97, 9, 226, 87, 254, 91, 96, 0, 145, 130, 82, 96, 32, 144, 145, 32, 96, 2, 144, 145, 2, 1, 128, 84, 96, 1, 144, 145, 1, 84, 96, 1, 96, 1, 96, 160, 27, 3, 144, 145, 22, 146, 80, 144, 80, 130, 86, 91, 97, 10, 20, 97, 10, 157, 86, 91, 97, 10, 48, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 59, 86, 91, 96, 1, 84, 96, 64, 81, 96, 0, 145, 96, 1, 96, 1, 96, 160, 27, 3, 22, 144, 127, 139, 224, 7, 156, 83, 22, 89, 20, 19, 68, 205, 31, 208, 164, 242, 132, 25, 73, 127, 151, 34, 163, 218, 175, 227, 180, 24, 111, 107, 100, 87, 224, 144, 131, 144, 163, 96, 1, 128, 84, 96, 1, 96, 1, 96, 160, 27, 3, 25, 22, 144, 85, 86, 91, 96, 0, 97, 4, 15, 96, 2, 131, 99, 255, 255, 255, 255, 97, 19, 197, 22, 86, 91, 96, 1, 84, 96, 1, 96, 1, 96, 160, 27, 3, 22, 91, 144, 86, 91, 96, 1, 84, 96, 0, 144, 96, 1, 96, 1, 96, 160, 27, 3, 22, 97, 10, 180, 97, 20, 13, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 22, 20, 144, 80, 144, 86, 91, 97, 10, 203, 97, 10, 157, 86, 91, 97, 10, 231, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 59, 86, 91, 97, 4, 248, 129, 97, 20, 17, 86, 91, 96, 11, 128, 84, 96, 64, 128, 81, 96, 32, 96, 2, 96, 1, 133, 22, 21, 97, 1, 0, 2, 96, 0, 25, 1, 144, 148, 22, 147, 144, 147, 4, 96, 31, 129, 1, 132, 144, 4, 132, 2, 130, 1, 132, 1, 144, 146, 82, 129, 129, 82, 146, 145, 131, 1, 130, 130, 128, 21, 97, 4, 186, 87, 128, 96, 31, 16, 97, 4, 143, 87, 97, 1, 0, 128, 131, 84, 4, 2, 131, 82, 145, 96, 32, 1, 145, 97, 4, 186, 86, 91, 97, 11, 83, 97, 10, 157, 86, 91, 97, 11, 111, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 59, 86, 91, 97, 4, 248, 129, 97, 20, 40, 86, 91, 51, 96, 0, 129, 129, 82, 96, 7, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 96, 1, 96, 1, 96, 160, 27, 3, 135, 22, 128, 133, 82, 146, 82, 145, 130, 144, 32, 128, 84, 96, 255, 25, 22, 133, 21, 21, 23, 144, 85, 144, 81, 144, 145, 144, 127, 23, 48, 126, 171, 57, 171, 97, 7, 232, 137, 152, 69, 173, 61, 89, 189, 150, 83, 242, 0, 242, 32, 146, 4, 137, 202, 43, 89, 55, 105, 108, 49, 144, 97, 11, 219, 144, 133, 144, 97, 42, 78, 86, 91, 96, 64, 81, 128, 145, 3, 144, 163, 80, 80, 86, 91, 96, 0, 129, 129, 82, 96, 9, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 128, 84, 130, 81, 129, 133, 2, 129, 1, 133, 1, 144, 147, 82, 128, 131, 82, 96, 96, 148, 133, 148, 132, 1, 91, 130, 130, 16, 21, 97, 12, 89, 87, 96, 0, 132, 129, 82, 96, 32, 144, 129, 144, 32, 96, 64, 128, 81, 128, 130, 1, 144, 145, 82, 96, 2, 133, 2, 144, 145, 1, 128, 84, 96, 1, 96, 1, 96, 160, 27, 3, 22, 130, 82, 96, 1, 144, 129, 1, 84, 130, 132, 1, 82, 144, 131, 82, 144, 146, 1, 145, 1, 97, 12, 17, 86, 91, 80, 80, 80, 80, 144, 80, 96, 96, 129, 81, 96, 64, 81, 144, 128, 130, 82, 128, 96, 32, 2, 96, 32, 1, 130, 1, 96, 64, 82, 128, 21, 97, 12, 140, 87, 129, 96, 32, 1, 96, 32, 130, 2, 128, 56, 131, 57, 1, 144, 80, 91, 80, 144, 80, 96, 0, 91, 130, 81, 129, 16, 21, 97, 5, 241, 87, 130, 129, 129, 81, 129, 16, 97, 12, 167, 87, 254, 91, 96, 32, 2, 96, 32, 1, 1, 81, 96, 0, 1, 81, 130, 130, 129, 81, 129, 16, 97, 12, 191, 87, 254, 91, 96, 1, 96, 1, 96, 160, 27, 3, 144, 146, 22, 96, 32, 146, 131, 2, 145, 144, 145, 1, 144, 145, 1, 82, 96, 1, 1, 97, 12, 146, 86, 91, 96, 3, 128, 84, 96, 64, 128, 81, 96, 32, 96, 2, 96, 1, 133, 22, 21, 97, 1, 0, 2, 96, 0, 25, 1, 144, 148, 22, 147, 144, 147, 4, 96, 31, 129, 1, 132, 144, 4, 132, 2, 130, 1, 132, 1, 144, 146, 82, 129, 129, 82, 146, 145, 131, 1, 130, 130, 128, 21, 97, 4, 186, 87, 128, 96, 31, 16, 97, 4, 143, 87, 97, 1, 0, 128, 131, 84, 4, 2, 131, 82, 145, 96, 32, 1, 145, 97, 4, 186, 86, 91, 97, 13, 66, 97, 10, 157, 86, 91, 97, 13, 94, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 59, 86, 91, 97, 13, 109, 135, 135, 135, 135, 135, 135, 135, 97, 20, 59, 86, 91, 80, 80, 80, 80, 80, 80, 80, 86, 91, 96, 8, 96, 32, 82, 96, 0, 144, 129, 82, 96, 64, 144, 32, 84, 96, 1, 96, 1, 96, 160, 27, 3, 22, 129, 86, 91, 97, 13, 161, 97, 13, 156, 97, 20, 13, 86, 91, 97, 17, 56, 86, 91, 86, 91, 96, 5, 128, 84, 96, 64, 128, 81, 96, 32, 96, 2, 96, 1, 133, 22, 21, 97, 1, 0, 2, 96, 0, 25, 1, 144, 148, 22, 147, 144, 147, 4, 96, 31, 129, 1, 132, 144, 4, 132, 2, 130, 1, 132, 1, 144, 146, 82, 129, 129, 82, 146, 145, 131, 1, 130, 130, 128, 21, 97, 4, 186, 87, 128, 96, 31, 16, 97, 4, 143, 87, 97, 1, 0, 128, 131, 84, 4, 2, 131, 82, 145, 96, 32, 1, 145, 97, 4, 186, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 145, 130, 22, 96, 0, 144, 129, 82, 96, 7, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 147, 144, 148, 22, 130, 82, 145, 144, 145, 82, 32, 84, 96, 255, 22, 144, 86, 91, 97, 14, 52, 97, 10, 157, 86, 91, 97, 14, 80, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 59, 86, 91, 97, 4, 248, 129, 97, 20, 226, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 133, 22, 97, 14, 127, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 171, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 134, 22, 51, 20, 128, 97, 14, 190, 87, 80, 96, 1, 96, 1, 96, 160, 27, 3, 134, 22, 96, 0, 144, 129, 82, 96, 7, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 51, 132, 82, 144, 145, 82, 144, 32, 84, 96, 255, 22, 21, 21, 96, 1, 20, 91, 97, 14, 218, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 27, 86, 91, 96, 0, 132, 129, 82, 96, 6, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 96, 1, 96, 1, 96, 160, 27, 3, 138, 22, 132, 82, 144, 145, 82, 144, 32, 84, 97, 15, 13, 144, 132, 99, 255, 255, 255, 255, 97, 18, 187, 22, 86, 91, 96, 0, 133, 129, 82, 96, 6, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 96, 1, 96, 1, 96, 160, 27, 3, 139, 129, 22, 133, 82, 146, 82, 128, 131, 32, 147, 144, 147, 85, 135, 22, 129, 82, 32, 84, 97, 15, 69, 144, 132, 144, 97, 18, 205, 86, 91, 96, 0, 133, 129, 82, 96, 6, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 96, 1, 96, 1, 96, 160, 27, 3, 128, 139, 22, 128, 134, 82, 145, 144, 147, 82, 146, 129, 144, 32, 147, 144, 147, 85, 145, 81, 144, 145, 136, 22, 144, 51, 144, 127, 195, 213, 129, 104, 197, 174, 115, 151, 115, 29, 6, 61, 91, 191, 61, 101, 120, 84, 66, 115, 67, 244, 192, 131, 36, 15, 122, 172, 170, 45, 15, 98, 144, 97, 15, 168, 144, 137, 144, 137, 144, 97, 44, 29, 86, 91, 96, 64, 81, 128, 145, 3, 144, 164, 97, 15, 194, 133, 96, 1, 96, 1, 96, 160, 27, 3, 22, 97, 18, 218, 86, 91, 21, 97, 16, 11, 87, 97, 16, 11, 51, 135, 135, 135, 135, 135, 135, 128, 128, 96, 31, 1, 96, 32, 128, 145, 4, 2, 96, 32, 1, 96, 64, 81, 144, 129, 1, 96, 64, 82, 128, 147, 146, 145, 144, 129, 129, 82, 96, 32, 1, 131, 131, 128, 130, 132, 55, 96, 0, 146, 1, 145, 144, 145, 82, 80, 97, 21, 42, 146, 80, 80, 80, 86, 91, 80, 80, 80, 80, 80, 80, 86, 91, 97, 16, 27, 97, 10, 157, 86, 91, 97, 16, 55, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 59, 86, 91, 97, 4, 248, 129, 97, 21, 217, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 131, 22, 51, 20, 128, 97, 16, 127, 87, 80, 96, 1, 96, 1, 96, 160, 27, 3, 131, 22, 96, 0, 144, 129, 82, 96, 7, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 51, 132, 82, 144, 145, 82, 144, 32, 84, 96, 255, 22, 21, 21, 96, 1, 20, 91, 97, 16, 155, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 11, 86, 91, 96, 0, 130, 129, 82, 96, 6, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 96, 1, 96, 1, 96, 160, 27, 3, 135, 22, 132, 82, 144, 145, 82, 144, 32, 84, 97, 16, 206, 144, 130, 99, 255, 255, 255, 255, 97, 18, 187, 22, 86, 91, 96, 0, 131, 129, 82, 96, 6, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 96, 1, 96, 1, 96, 160, 27, 3, 136, 22, 128, 133, 82, 146, 82, 128, 131, 32, 147, 144, 147, 85, 145, 81, 144, 145, 144, 51, 144, 127, 195, 213, 129, 104, 197, 174, 115, 151, 115, 29, 6, 61, 91, 191, 61, 101, 120, 84, 66, 115, 67, 244, 192, 131, 36, 15, 122, 172, 170, 45, 15, 98, 144, 97, 17, 43, 144, 135, 144, 135, 144, 97, 44, 29, 86, 91, 96, 64, 81, 128, 145, 3, 144, 164, 80, 80, 80, 86, 91, 97, 17, 73, 96, 2, 130, 99, 255, 255, 255, 255, 97, 22, 91, 22, 86, 91, 96, 64, 81, 96, 1, 96, 1, 96, 160, 27, 3, 130, 22, 144, 127, 53, 37, 226, 40, 36, 168, 167, 223, 44, 154, 96, 41, 148, 28, 130, 76, 249, 91, 100, 71, 241, 225, 61, 81, 40, 253, 56, 38, 211, 90, 254, 139, 144, 96, 0, 144, 162, 80, 86, 91, 96, 0, 129, 129, 82, 96, 4, 96, 32, 144, 129, 82, 96, 64, 145, 130, 144, 32, 128, 84, 131, 81, 96, 2, 96, 1, 131, 22, 21, 97, 1, 0, 2, 96, 0, 25, 1, 144, 146, 22, 145, 144, 145, 4, 96, 31, 129, 1, 132, 144, 4, 132, 2, 130, 1, 132, 1, 144, 148, 82, 131, 129, 82, 96, 96, 147, 97, 4, 15, 147, 145, 146, 145, 131, 1, 130, 130, 128, 21, 97, 18, 26, 87, 128, 96, 31, 16, 97, 17, 239, 87, 97, 1, 0, 128, 131, 84, 4, 2, 131, 82, 145, 96, 32, 1, 145, 97, 18, 26, 86, 91, 130, 1, 145, 144, 96, 0, 82, 96, 32, 96, 0, 32, 144, 91, 129, 84, 129, 82, 144, 96, 1, 1, 144, 96, 32, 1, 128, 131, 17, 97, 17, 253, 87, 130, 144, 3, 96, 31, 22, 130, 1, 145, 91, 80, 80, 96, 3, 128, 84, 96, 64, 128, 81, 96, 32, 96, 31, 96, 2, 96, 0, 25, 97, 1, 0, 96, 1, 136, 22, 21, 2, 1, 144, 149, 22, 148, 144, 148, 4, 147, 132, 1, 129, 144, 4, 129, 2, 130, 1, 129, 1, 144, 146, 82, 130, 129, 82, 149, 80, 145, 147, 80, 145, 80, 131, 1, 130, 130, 128, 21, 97, 18, 168, 87, 128, 96, 31, 16, 97, 18, 125, 87, 97, 1, 0, 128, 131, 84, 4, 2, 131, 82, 145, 96, 32, 1, 145, 97, 18, 168, 86, 91, 130, 1, 145, 144, 96, 0, 82, 96, 32, 96, 0, 32, 144, 91, 129, 84, 129, 82, 144, 96, 1, 1, 144, 96, 32, 1, 128, 131, 17, 97, 18, 139, 87, 130, 144, 3, 96, 31, 22, 130, 1, 145, 91, 80, 80, 80, 80, 80, 97, 22, 163, 144, 145, 144, 99, 255, 255, 255, 255, 22, 86, 91, 96, 0, 130, 130, 17, 21, 97, 18, 199, 87, 254, 91, 80, 144, 3, 144, 86, 91, 129, 129, 1, 130, 129, 16, 21, 97, 4, 15, 87, 254, 91, 96, 0, 129, 63, 127, 197, 210, 70, 1, 134, 247, 35, 60, 146, 126, 125, 178, 220, 199, 3, 192, 229, 0, 182, 83, 202, 130, 39, 59, 123, 250, 216, 4, 93, 133, 164, 112, 129, 129, 20, 128, 21, 144, 97, 19, 14, 87, 80, 129, 21, 21, 91, 148, 147, 80, 80, 80, 80, 86, 91, 96, 64, 81, 99, 188, 25, 124, 129, 96, 224, 27, 128, 130, 82, 144, 96, 1, 96, 1, 96, 160, 27, 3, 134, 22, 144, 99, 188, 25, 124, 129, 144, 97, 19, 76, 144, 138, 144, 138, 144, 137, 144, 137, 144, 137, 144, 96, 4, 1, 97, 41, 84, 86, 91, 96, 32, 96, 64, 81, 128, 131, 3, 129, 96, 0, 135, 128, 59, 21, 128, 21, 97, 19, 102, 87, 96, 0, 128, 253, 91, 80, 90, 241, 21, 128, 21, 97, 19, 122, 87, 61, 96, 0, 128, 62, 61, 96, 0, 253, 91, 80, 80, 80, 80, 96, 64, 81, 61, 96, 31, 25, 96, 31, 130, 1, 22, 130, 1, 128, 96, 64, 82, 80, 97, 19, 158, 145, 144, 129, 1, 144, 97, 32, 240, 86, 91, 96, 1, 96, 1, 96, 224, 27, 3, 25, 22, 20, 97, 16, 11, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 43, 86, 91, 96, 0, 96, 1, 96, 1, 96, 160, 27, 3, 130, 22, 97, 19, 237, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 75, 86, 91, 80, 96, 1, 96, 1, 96, 160, 27, 3, 22, 96, 0, 144, 129, 82, 96, 32, 145, 144, 145, 82, 96, 64, 144, 32, 84, 96, 255, 22, 144, 86, 91, 51, 144, 86, 91, 128, 81, 97, 20, 36, 144, 96, 5, 144, 96, 32, 132, 1, 144, 97, 27, 143, 86, 91, 80, 80, 86, 91, 128, 81, 97, 20, 36, 144, 96, 3, 144, 96, 32, 132, 1, 144, 97, 27, 143, 86, 91, 97, 20, 186, 96, 1, 48, 137, 96, 64, 81, 96, 32, 1, 97, 20, 83, 146, 145, 144, 97, 40, 254, 86, 91, 96, 64, 81, 96, 32, 129, 131, 3, 3, 129, 82, 144, 96, 64, 82, 128, 81, 144, 96, 32, 1, 32, 136, 136, 136, 96, 64, 81, 96, 0, 129, 82, 96, 32, 1, 96, 64, 82, 96, 64, 81, 97, 20, 137, 148, 147, 146, 145, 144, 97, 42, 92, 86, 91, 96, 32, 96, 64, 81, 96, 32, 129, 3, 144, 128, 132, 3, 144, 133, 90, 250, 21, 128, 21, 97, 20, 171, 87, 61, 96, 0, 128, 62, 61, 96, 0, 253, 91, 80, 80, 80, 96, 32, 96, 64, 81, 3, 81, 97, 10, 122, 86, 91, 97, 20, 214, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 187, 86, 91, 97, 13, 109, 135, 132, 132, 132, 97, 23, 152, 86, 91, 97, 20, 243, 96, 2, 130, 99, 255, 255, 255, 255, 97, 26, 230, 22, 86, 91, 96, 64, 81, 96, 1, 96, 1, 96, 160, 27, 3, 130, 22, 144, 127, 71, 209, 194, 42, 37, 187, 58, 93, 78, 72, 27, 155, 30, 105, 68, 194, 234, 222, 49, 129, 160, 162, 11, 73, 94, 214, 29, 53, 181, 50, 63, 36, 144, 96, 0, 144, 162, 80, 86, 91, 96, 64, 81, 99, 242, 58, 110, 97, 96, 224, 27, 128, 130, 82, 144, 96, 1, 96, 1, 96, 160, 27, 3, 134, 22, 144, 99, 242, 58, 110, 97, 144, 97, 21, 96, 144, 138, 144, 138, 144, 137, 144, 137, 144, 137, 144, 96, 4, 1, 97, 41, 180, 86, 91, 96, 32, 96, 64, 81, 128, 131, 3, 129, 96, 0, 135, 128, 59, 21, 128, 21, 97, 21, 122, 87, 96, 0, 128, 253, 91, 80, 90, 241, 21, 128, 21, 97, 21, 142, 87, 61, 96, 0, 128, 62, 61, 96, 0, 253, 91, 80, 80, 80, 80, 96, 64, 81, 61, 96, 31, 25, 96, 31, 130, 1, 22, 130, 1, 128, 96, 64, 82, 80, 97, 21, 178, 145, 144, 129, 1, 144, 97, 32, 240, 86, 91, 96, 1, 96, 1, 96, 224, 27, 3, 25, 22, 20, 97, 16, 11, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 155, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 129, 22, 97, 21, 255, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 42, 203, 86, 91, 96, 1, 84, 96, 64, 81, 96, 1, 96, 1, 96, 160, 27, 3, 128, 132, 22, 146, 22, 144, 127, 139, 224, 7, 156, 83, 22, 89, 20, 19, 68, 205, 31, 208, 164, 242, 132, 25, 73, 127, 151, 34, 163, 218, 175, 227, 180, 24, 111, 107, 100, 87, 224, 144, 96, 0, 144, 163, 96, 1, 128, 84, 96, 1, 96, 1, 96, 160, 27, 3, 25, 22, 96, 1, 96, 1, 96, 160, 27, 3, 146, 144, 146, 22, 145, 144, 145, 23, 144, 85, 86, 91, 97, 22, 101, 130, 130, 97, 19, 197, 86, 91, 97, 22, 129, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 42, 251, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 22, 96, 0, 144, 129, 82, 96, 32, 145, 144, 145, 82, 96, 64, 144, 32, 128, 84, 96, 255, 25, 22, 144, 85, 86, 91, 96, 96, 128, 131, 144, 80, 96, 96, 131, 144, 80, 96, 96, 129, 81, 131, 81, 1, 96, 64, 81, 144, 128, 130, 82, 128, 96, 31, 1, 96, 31, 25, 22, 96, 32, 1, 130, 1, 96, 64, 82, 128, 21, 97, 22, 223, 87, 96, 32, 130, 1, 129, 128, 56, 131, 57, 1, 144, 80, 91, 80, 144, 80, 96, 0, 128, 91, 132, 81, 129, 16, 21, 97, 23, 55, 87, 132, 129, 129, 81, 129, 16, 97, 22, 251, 87, 254, 91, 96, 32, 1, 1, 81, 96, 248, 28, 96, 248, 27, 131, 131, 128, 96, 1, 1, 148, 80, 129, 81, 129, 16, 97, 23, 24, 87, 254, 91, 96, 32, 1, 1, 144, 96, 1, 96, 1, 96, 248, 27, 3, 25, 22, 144, 129, 96, 0, 26, 144, 83, 80, 96, 1, 1, 97, 22, 230, 86, 91, 80, 96, 0, 91, 131, 81, 129, 16, 21, 97, 23, 140, 87, 131, 129, 129, 81, 129, 16, 97, 23, 80, 87, 254, 91, 96, 32, 1, 1, 81, 96, 248, 28, 96, 248, 27, 131, 131, 128, 96, 1, 1, 148, 80, 129, 81, 129, 16, 97, 23, 109, 87, 254, 91, 96, 32, 1, 1, 144, 96, 1, 96, 1, 96, 248, 27, 3, 25, 22, 144, 129, 96, 0, 26, 144, 83, 80, 96, 1, 1, 97, 23, 59, 86, 91, 80, 144, 150, 149, 80, 80, 80, 80, 80, 80, 86, 91, 96, 0, 132, 129, 82, 96, 8, 96, 32, 82, 96, 64, 144, 32, 84, 96, 1, 96, 1, 96, 160, 27, 3, 22, 21, 97, 23, 205, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 91, 86, 91, 129, 97, 23, 234, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 107, 86, 91, 96, 0, 129, 81, 17, 97, 24, 11, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 203, 86, 91, 96, 0, 132, 129, 82, 96, 8, 96, 32, 144, 129, 82, 96, 64, 145, 130, 144, 32, 128, 84, 96, 1, 96, 1, 96, 160, 27, 3, 25, 22, 51, 23, 144, 85, 132, 81, 130, 81, 129, 129, 82, 129, 131, 2, 129, 1, 144, 146, 1, 144, 146, 82, 96, 96, 145, 128, 21, 97, 24, 88, 87, 129, 96, 32, 1, 96, 32, 130, 2, 128, 56, 131, 57, 1, 144, 80, 91, 80, 144, 80, 96, 96, 132, 81, 96, 64, 81, 144, 128, 130, 82, 128, 96, 32, 2, 96, 32, 1, 130, 1, 96, 64, 82, 128, 21, 97, 24, 136, 87, 129, 96, 32, 1, 96, 32, 130, 2, 128, 56, 131, 57, 1, 144, 80, 91, 80, 144, 80, 96, 0, 91, 133, 81, 129, 16, 21, 97, 25, 251, 87, 96, 0, 96, 1, 96, 1, 96, 160, 27, 3, 22, 134, 130, 129, 81, 129, 16, 97, 24, 174, 87, 254, 91, 96, 32, 2, 96, 32, 1, 1, 81, 96, 0, 1, 81, 96, 1, 96, 1, 96, 160, 27, 3, 22, 20, 21, 97, 24, 225, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 139, 86, 91, 133, 129, 129, 81, 129, 16, 97, 24, 237, 87, 254, 91, 96, 32, 2, 96, 32, 1, 1, 81, 96, 32, 1, 81, 96, 0, 20, 21, 97, 25, 25, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 42, 171, 86, 91, 96, 0, 135, 129, 82, 96, 9, 96, 32, 82, 96, 64, 144, 32, 134, 81, 135, 144, 131, 144, 129, 16, 97, 25, 53, 87, 254, 91, 96, 32, 144, 129, 2, 145, 144, 145, 1, 129, 1, 81, 130, 84, 96, 1, 128, 130, 1, 133, 85, 96, 0, 148, 133, 82, 147, 131, 144, 32, 130, 81, 96, 2, 144, 146, 2, 1, 128, 84, 96, 1, 96, 1, 96, 160, 27, 3, 25, 22, 96, 1, 96, 1, 96, 160, 27, 3, 144, 146, 22, 145, 144, 145, 23, 129, 85, 145, 1, 81, 145, 1, 85, 133, 81, 134, 144, 130, 144, 129, 16, 97, 25, 140, 87, 254, 91, 96, 32, 2, 96, 32, 1, 1, 81, 96, 0, 1, 81, 131, 130, 129, 81, 129, 16, 97, 25, 164, 87, 254, 91, 96, 32, 2, 96, 32, 1, 1, 144, 96, 1, 96, 1, 96, 160, 27, 3, 22, 144, 129, 96, 1, 96, 1, 96, 160, 27, 3, 22, 129, 82, 80, 80, 133, 129, 129, 81, 129, 16, 97, 25, 208, 87, 254, 91, 96, 32, 2, 96, 32, 1, 1, 81, 96, 32, 1, 81, 130, 130, 129, 81, 129, 16, 97, 25, 232, 87, 254, 91, 96, 32, 144, 129, 2, 145, 144, 145, 1, 1, 82, 96, 1, 1, 97, 24, 142, 86, 91, 80, 132, 81, 21, 97, 26, 63, 87, 127, 153, 171, 161, 214, 55, 73, 207, 213, 173, 26, 253, 167, 196, 102, 56, 64, 146, 77, 84, 235, 95, 0, 91, 187, 234, 222, 220, 110, 193, 54, 116, 178, 134, 131, 131, 96, 64, 81, 97, 26, 54, 147, 146, 145, 144, 97, 43, 233, 86, 91, 96, 64, 81, 128, 145, 3, 144, 161, 91, 96, 0, 134, 129, 82, 96, 6, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 51, 132, 82, 144, 145, 82, 144, 32, 132, 144, 85, 97, 26, 101, 134, 132, 97, 27, 50, 86, 91, 96, 64, 81, 51, 144, 96, 0, 144, 130, 144, 127, 195, 213, 129, 104, 197, 174, 115, 151, 115, 29, 6, 61, 91, 191, 61, 101, 120, 84, 66, 115, 67, 244, 192, 131, 36, 15, 122, 172, 170, 45, 15, 98, 144, 97, 26, 158, 144, 139, 144, 138, 144, 97, 44, 29, 86, 91, 96, 64, 81, 128, 145, 3, 144, 164, 133, 127, 107, 183, 255, 112, 134, 25, 186, 6, 16, 203, 162, 149, 165, 133, 146, 224, 69, 29, 238, 38, 34, 147, 140, 135, 85, 102, 118, 136, 218, 243, 82, 155, 132, 96, 64, 81, 97, 26, 214, 145, 144, 97, 42, 154, 86, 91, 96, 64, 81, 128, 145, 3, 144, 162, 80, 80, 80, 80, 80, 80, 86, 91, 97, 26, 240, 130, 130, 97, 19, 197, 86, 91, 21, 97, 27, 13, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 42, 187, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 22, 96, 0, 144, 129, 82, 96, 32, 145, 144, 145, 82, 96, 64, 144, 32, 128, 84, 96, 255, 25, 22, 96, 1, 23, 144, 85, 86, 91, 96, 0, 130, 129, 82, 96, 8, 96, 32, 82, 96, 64, 144, 32, 84, 96, 1, 96, 1, 96, 160, 27, 3, 22, 97, 27, 102, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 42, 219, 86, 91, 97, 20, 36, 130, 130, 96, 0, 130, 129, 82, 96, 4, 96, 32, 144, 129, 82, 96, 64, 144, 145, 32, 130, 81, 97, 27, 138, 146, 132, 1, 144, 97, 27, 143, 86, 91, 80, 80, 80, 86, 91, 130, 128, 84, 96, 1, 129, 96, 1, 22, 21, 97, 1, 0, 2, 3, 22, 96, 2, 144, 4, 144, 96, 0, 82, 96, 32, 96, 0, 32, 144, 96, 31, 1, 96, 32, 144, 4, 129, 1, 146, 130, 96, 31, 16, 97, 27, 208, 87, 128, 81, 96, 255, 25, 22, 131, 128, 1, 23, 133, 85, 97, 27, 253, 86, 91, 130, 128, 1, 96, 1, 1, 133, 85, 130, 21, 97, 27, 253, 87, 145, 130, 1, 91, 130, 129, 17, 21, 97, 27, 253, 87, 130, 81, 130, 85, 145, 96, 32, 1, 145, 144, 96, 1, 1, 144, 97, 27, 226, 86, 91, 80, 97, 28, 9, 146, 145, 80, 97, 28, 13, 86, 91, 80, 144, 86, 91, 97, 10, 154, 145, 144, 91, 128, 130, 17, 21, 97, 28, 9, 87, 96, 0, 129, 85, 96, 1, 1, 97, 28, 19, 86, 91, 128, 53, 97, 4, 15, 129, 97, 45, 66, 86, 91, 96, 0, 128, 131, 96, 31, 132, 1, 18, 97, 28, 68, 87, 96, 0, 128, 253, 91, 80, 129, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 28, 91, 87, 96, 0, 128, 253, 91, 96, 32, 131, 1, 145, 80, 131, 96, 32, 130, 2, 131, 1, 17, 21, 97, 28, 115, 87, 96, 0, 128, 253, 91, 146, 80, 146, 144, 80, 86, 91, 96, 0, 130, 96, 31, 131, 1, 18, 97, 28, 139, 87, 96, 0, 128, 253, 91, 129, 53, 97, 28, 158, 97, 28, 153, 130, 97, 44, 81, 86, 91, 97, 44, 43, 86, 91, 145, 80, 129, 129, 131, 82, 96, 32, 132, 1, 147, 80, 96, 32, 129, 1, 144, 80, 131, 133, 96, 64, 132, 2, 130, 1, 17, 21, 97, 28, 195, 87, 96, 0, 128, 253, 91, 96, 0, 91, 131, 129, 16, 21, 97, 28, 241, 87, 129, 97, 28, 217, 136, 130, 97, 29, 183, 86, 91, 132, 82, 80, 96, 32, 144, 146, 1, 145, 96, 64, 145, 144, 145, 1, 144, 96, 1, 1, 97, 28, 198, 86, 91, 80, 80, 80, 80, 146, 145, 80, 80, 86, 91, 128, 53, 97, 4, 15, 129, 97, 45, 86, 86, 91, 128, 53, 97, 4, 15, 129, 97, 45, 95, 86, 91, 128, 53, 97, 4, 15, 129, 97, 45, 104, 86, 91, 128, 81, 97, 4, 15, 129, 97, 45, 104, 86, 91, 96, 0, 128, 131, 96, 31, 132, 1, 18, 97, 29, 57, 87, 96, 0, 128, 253, 91, 80, 129, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 29, 80, 87, 96, 0, 128, 253, 91, 96, 32, 131, 1, 145, 80, 131, 96, 1, 130, 2, 131, 1, 17, 21, 97, 28, 115, 87, 96, 0, 128, 253, 91, 96, 0, 130, 96, 31, 131, 1, 18, 97, 29, 121, 87, 96, 0, 128, 253, 91, 129, 53, 97, 29, 135, 97, 28, 153, 130, 97, 44, 113, 86, 91, 145, 80, 128, 130, 82, 96, 32, 131, 1, 96, 32, 131, 1, 133, 131, 131, 1, 17, 21, 97, 29, 163, 87, 96, 0, 128, 253, 91, 97, 29, 174, 131, 130, 132, 97, 44, 229, 86, 91, 80, 80, 80, 146, 145, 80, 80, 86, 91, 96, 0, 96, 64, 130, 132, 3, 18, 21, 97, 29, 201, 87, 96, 0, 128, 253, 91, 97, 29, 211, 96, 64, 97, 44, 43, 86, 91, 144, 80, 96, 0, 97, 29, 225, 132, 132, 97, 28, 39, 86, 91, 130, 82, 80, 96, 32, 97, 29, 242, 132, 132, 131, 1, 97, 29, 6, 86, 91, 96, 32, 131, 1, 82, 80, 146, 145, 80, 80, 86, 91, 128, 53, 97, 4, 15, 129, 97, 45, 113, 86, 91, 96, 0, 96, 32, 130, 132, 3, 18, 21, 97, 30, 27, 87, 96, 0, 128, 253, 91, 96, 0, 97, 19, 14, 132, 132, 97, 28, 39, 86, 91, 96, 0, 128, 96, 64, 131, 133, 3, 18, 21, 97, 30, 58, 87, 96, 0, 128, 253, 91, 96, 0, 97, 30, 70, 133, 133, 97, 28, 39, 86, 91, 146, 80, 80, 96, 32, 97, 30, 87, 133, 130, 134, 1, 97, 28, 39, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 91, 96, 0, 128, 96, 0, 128, 96, 0, 128, 96, 0, 128, 96, 160, 137, 139, 3, 18, 21, 97, 30, 125, 87, 96, 0, 128, 253, 91, 96, 0, 97, 30, 137, 139, 139, 97, 28, 39, 86, 91, 152, 80, 80, 96, 32, 97, 30, 154, 139, 130, 140, 1, 97, 28, 39, 86, 91, 151, 80, 80, 96, 64, 137, 1, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 30, 182, 87, 96, 0, 128, 253, 91, 97, 30, 194, 139, 130, 140, 1, 97, 28, 50, 86, 91, 150, 80, 150, 80, 80, 96, 96, 137, 1, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 30, 224, 87, 96, 0, 128, 253, 91, 97, 30, 236, 139, 130, 140, 1, 97, 28, 50, 86, 91, 148, 80, 148, 80, 80, 96, 128, 137, 1, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 31, 10, 87, 96, 0, 128, 253, 91, 97, 31, 22, 139, 130, 140, 1, 97, 29, 39, 86, 91, 146, 80, 146, 80, 80, 146, 149, 152, 80, 146, 149, 152, 144, 147, 150, 80, 86, 91, 96, 0, 128, 96, 0, 128, 96, 0, 128, 96, 160, 135, 137, 3, 18, 21, 97, 31, 65, 87, 96, 0, 128, 253, 91, 96, 0, 97, 31, 77, 137, 137, 97, 28, 39, 86, 91, 150, 80, 80, 96, 32, 97, 31, 94, 137, 130, 138, 1, 97, 28, 39, 86, 91, 149, 80, 80, 96, 64, 97, 31, 111, 137, 130, 138, 1, 97, 29, 6, 86, 91, 148, 80, 80, 96, 96, 97, 31, 128, 137, 130, 138, 1, 97, 29, 6, 86, 91, 147, 80, 80, 96, 128, 135, 1, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 31, 156, 87, 96, 0, 128, 253, 91, 97, 31, 168, 137, 130, 138, 1, 97, 29, 39, 86, 91, 146, 80, 146, 80, 80, 146, 149, 80, 146, 149, 80, 146, 149, 86, 91, 96, 0, 128, 96, 64, 131, 133, 3, 18, 21, 97, 31, 202, 87, 96, 0, 128, 253, 91, 96, 0, 97, 31, 214, 133, 133, 97, 28, 39, 86, 91, 146, 80, 80, 96, 32, 97, 30, 87, 133, 130, 134, 1, 97, 28, 251, 86, 91, 96, 0, 128, 96, 64, 131, 133, 3, 18, 21, 97, 31, 250, 87, 96, 0, 128, 253, 91, 96, 0, 97, 32, 6, 133, 133, 97, 28, 39, 86, 91, 146, 80, 80, 96, 32, 97, 30, 87, 133, 130, 134, 1, 97, 29, 6, 86, 91, 96, 0, 128, 96, 0, 96, 96, 132, 134, 3, 18, 21, 97, 32, 44, 87, 96, 0, 128, 253, 91, 96, 0, 97, 32, 56, 134, 134, 97, 28, 39, 86, 91, 147, 80, 80, 96, 32, 97, 32, 73, 134, 130, 135, 1, 97, 29, 6, 86, 91, 146, 80, 80, 96, 64, 97, 32, 90, 134, 130, 135, 1, 97, 29, 6, 86, 91, 145, 80, 80, 146, 80, 146, 80, 146, 86, 91, 96, 0, 128, 96, 0, 128, 96, 64, 133, 135, 3, 18, 21, 97, 32, 122, 87, 96, 0, 128, 253, 91, 132, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 32, 144, 87, 96, 0, 128, 253, 91, 97, 32, 156, 135, 130, 136, 1, 97, 28, 50, 86, 91, 148, 80, 148, 80, 80, 96, 32, 133, 1, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 32, 186, 87, 96, 0, 128, 253, 91, 97, 32, 198, 135, 130, 136, 1, 97, 28, 50, 86, 91, 149, 152, 148, 151, 80, 149, 80, 80, 80, 80, 86, 91, 96, 0, 96, 32, 130, 132, 3, 18, 21, 97, 32, 228, 87, 96, 0, 128, 253, 91, 96, 0, 97, 19, 14, 132, 132, 97, 29, 17, 86, 91, 96, 0, 96, 32, 130, 132, 3, 18, 21, 97, 33, 2, 87, 96, 0, 128, 253, 91, 96, 0, 97, 19, 14, 132, 132, 97, 29, 28, 86, 91, 96, 0, 96, 32, 130, 132, 3, 18, 21, 97, 33, 32, 87, 96, 0, 128, 253, 91, 129, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 33, 54, 87, 96, 0, 128, 253, 91, 97, 19, 14, 132, 130, 133, 1, 97, 29, 104, 86, 91, 96, 0, 96, 32, 130, 132, 3, 18, 21, 97, 33, 84, 87, 96, 0, 128, 253, 91, 96, 0, 97, 19, 14, 132, 132, 97, 29, 6, 86, 91, 96, 0, 128, 96, 64, 131, 133, 3, 18, 21, 97, 33, 115, 87, 96, 0, 128, 253, 91, 96, 0, 97, 32, 6, 133, 133, 97, 29, 6, 86, 91, 96, 0, 128, 96, 0, 128, 96, 0, 128, 96, 0, 96, 224, 136, 138, 3, 18, 21, 97, 33, 154, 87, 96, 0, 128, 253, 91, 96, 0, 97, 33, 166, 138, 138, 97, 29, 6, 86, 91, 151, 80, 80, 96, 32, 97, 33, 183, 138, 130, 139, 1, 97, 29, 254, 86, 91, 150, 80, 80, 96, 64, 97, 33, 200, 138, 130, 139, 1, 97, 29, 6, 86, 91, 149, 80, 80, 96, 96, 97, 33, 217, 138, 130, 139, 1, 97, 29, 6, 86, 91, 148, 80, 80, 96, 128, 136, 1, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 33, 245, 87, 96, 0, 128, 253, 91, 97, 34, 1, 138, 130, 139, 1, 97, 28, 122, 86, 91, 147, 80, 80, 96, 160, 97, 34, 18, 138, 130, 139, 1, 97, 29, 6, 86, 91, 146, 80, 80, 96, 192, 136, 1, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 34, 46, 87, 96, 0, 128, 253, 91, 97, 34, 58, 138, 130, 139, 1, 97, 29, 104, 86, 91, 145, 80, 80, 146, 149, 152, 145, 148, 151, 80, 146, 149, 80, 86, 91, 96, 0, 97, 34, 85, 131, 131, 97, 34, 105, 86, 91, 80, 80, 96, 32, 1, 144, 86, 91, 96, 0, 97, 34, 85, 131, 131, 97, 35, 175, 86, 91, 97, 34, 114, 129, 97, 44, 171, 86, 91, 130, 82, 80, 80, 86, 91, 96, 0, 97, 34, 131, 130, 97, 44, 158, 86, 91, 97, 34, 141, 129, 133, 97, 44, 162, 86, 91, 147, 80, 97, 34, 152, 131, 97, 44, 152, 86, 91, 128, 96, 0, 91, 131, 129, 16, 21, 97, 34, 198, 87, 129, 81, 97, 34, 176, 136, 130, 97, 34, 73, 86, 91, 151, 80, 97, 34, 187, 131, 97, 44, 152, 86, 91, 146, 80, 80, 96, 1, 1, 97, 34, 156, 86, 91, 80, 148, 149, 148, 80, 80, 80, 80, 80, 86, 91, 96, 0, 97, 34, 220, 130, 97, 44, 158, 86, 91, 97, 34, 230, 129, 133, 97, 44, 162, 86, 91, 147, 80, 97, 34, 241, 131, 97, 44, 152, 86, 91, 128, 96, 0, 91, 131, 129, 16, 21, 97, 34, 198, 87, 129, 81, 97, 35, 9, 136, 130, 97, 34, 73, 86, 91, 151, 80, 97, 35, 20, 131, 97, 44, 152, 86, 91, 146, 80, 80, 96, 1, 1, 97, 34, 245, 86, 91, 96, 0, 97, 35, 43, 131, 133, 97, 44, 162, 86, 91, 147, 80, 96, 1, 96, 1, 96, 251, 27, 3, 131, 17, 21, 97, 35, 65, 87, 96, 0, 128, 253, 91, 96, 32, 131, 2, 146, 80, 97, 35, 82, 131, 133, 132, 97, 44, 229, 86, 91, 80, 80, 1, 144, 86, 91, 96, 0, 97, 35, 99, 130, 97, 44, 158, 86, 91, 97, 35, 109, 129, 133, 97, 44, 162, 86, 91, 147, 80, 97, 35, 120, 131, 97, 44, 152, 86, 91, 128, 96, 0, 91, 131, 129, 16, 21, 97, 34, 198, 87, 129, 81, 97, 35, 144, 136, 130, 97, 34, 93, 86, 91, 151, 80, 97, 35, 155, 131, 97, 44, 152, 86, 91, 146, 80, 80, 96, 1, 1, 97, 35, 124, 86, 91, 97, 34, 114, 129, 97, 44, 182, 86, 91, 97, 34, 114, 129, 97, 10, 154, 86, 91, 96, 0, 97, 35, 195, 130, 97, 44, 158, 86, 91, 97, 35, 205, 129, 133, 97, 44, 162, 86, 91, 147, 80, 97, 35, 221, 129, 133, 96, 32, 134, 1, 97, 44, 241, 86, 91, 97, 35, 230, 129, 97, 45, 50, 86, 91, 144, 147, 1, 147, 146, 80, 80, 80, 86, 91, 97, 34, 114, 97, 35, 252, 130, 97, 44, 218, 86, 91, 97, 45, 33, 86, 91, 96, 0, 97, 36, 14, 96, 28, 131, 97, 44, 162, 86, 91, 127, 70, 101, 101, 32, 118, 97, 108, 117, 101, 32, 115, 104, 111, 117, 108, 100, 32, 98, 101, 32, 112, 111, 115, 105, 116, 105, 118, 101, 0, 0, 0, 0, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 36, 71, 96, 31, 131, 97, 44, 162, 86, 91, 127, 82, 111, 108, 101, 115, 58, 32, 97, 99, 99, 111, 117, 110, 116, 32, 97, 108, 114, 101, 97, 100, 121, 32, 104, 97, 115, 32, 114, 111, 108, 101, 0, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 36, 128, 96, 38, 131, 97, 44, 162, 86, 91, 127, 79, 119, 110, 97, 98, 108, 101, 58, 32, 110, 101, 119, 32, 111, 119, 110, 101, 114, 32, 105, 115, 32, 116, 104, 101, 32, 122, 101, 114, 111, 32, 97, 129, 82, 101, 100, 100, 114, 101, 115, 115, 96, 208, 27, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 36, 200, 96, 32, 131, 97, 44, 162, 86, 91, 127, 95, 115, 101, 116, 84, 111, 107, 101, 110, 85, 82, 73, 58, 32, 84, 111, 107, 101, 110, 32, 115, 104, 111, 117, 108, 100, 32, 101, 120, 105, 115, 116, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 37, 1, 96, 37, 131, 97, 44, 162, 86, 91, 127, 100, 101, 115, 116, 105, 110, 97, 116, 105, 111, 110, 32, 97, 100, 100, 114, 101, 115, 115, 32, 109, 117, 115, 116, 32, 98, 101, 32, 110, 111, 110, 45, 129, 82, 100, 61, 50, 185, 55, 151, 96, 217, 27, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 37, 72, 96, 33, 131, 97, 44, 162, 86, 91, 127, 82, 111, 108, 101, 115, 58, 32, 97, 99, 99, 111, 117, 110, 116, 32, 100, 111, 101, 115, 32, 110, 111, 116, 32, 104, 97, 118, 101, 32, 114, 111, 108, 129, 82, 96, 101, 96, 248, 27, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 37, 139, 96, 43, 131, 97, 44, 162, 86, 91, 127, 78, 101, 101, 100, 32, 111, 112, 101, 114, 97, 116, 111, 114, 32, 97, 112, 112, 114, 111, 118, 97, 108, 32, 102, 111, 114, 32, 51, 114, 100, 32, 112, 129, 82, 106, 48, 185, 58, 60, 144, 49, 58, 185, 55, 57, 151, 96, 169, 27, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 37, 216, 96, 47, 131, 97, 44, 162, 86, 91, 127, 78, 101, 101, 100, 32, 111, 112, 101, 114, 97, 116, 111, 114, 32, 97, 112, 112, 114, 111, 118, 97, 108, 32, 102, 111, 114, 32, 51, 114, 100, 32, 112, 129, 82, 110, 48, 185, 58, 60, 144, 58, 57, 48, 183, 57, 179, 50, 185, 57, 151, 96, 137, 27, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 38, 41, 96, 62, 131, 97, 44, 162, 86, 91, 127, 99, 111, 110, 116, 114, 97, 99, 116, 32, 114, 101, 116, 117, 114, 110, 101, 100, 32, 97, 110, 32, 117, 110, 107, 110, 111, 119, 110, 32, 118, 97, 108, 129, 82, 127, 117, 101, 32, 102, 114, 111, 109, 32, 111, 110, 69, 82, 67, 49, 49, 53, 53, 66, 97, 116, 99, 104, 82, 101, 99, 101, 105, 118, 101, 100, 0, 0, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 38, 136, 96, 32, 131, 97, 44, 162, 86, 91, 127, 79, 119, 110, 97, 98, 108, 101, 58, 32, 99, 97, 108, 108, 101, 114, 32, 105, 115, 32, 110, 111, 116, 32, 116, 104, 101, 32, 111, 119, 110, 101, 114, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 38, 193, 96, 34, 131, 97, 44, 162, 86, 91, 127, 82, 111, 108, 101, 115, 58, 32, 97, 99, 99, 111, 117, 110, 116, 32, 105, 115, 32, 116, 104, 101, 32, 122, 101, 114, 111, 32, 97, 100, 100, 114, 101, 129, 82, 97, 115, 115, 96, 240, 27, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 39, 5, 96, 23, 131, 97, 44, 162, 86, 91, 127, 84, 111, 107, 101, 110, 32, 105, 115, 32, 97, 108, 114, 101, 97, 100, 121, 32, 109, 105, 110, 116, 101, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 39, 62, 96, 25, 131, 97, 44, 162, 86, 91, 127, 83, 117, 112, 112, 108, 121, 32, 115, 104, 111, 117, 108, 100, 32, 98, 101, 32, 112, 111, 115, 105, 116, 105, 118, 101, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 39, 119, 96, 41, 131, 97, 44, 162, 86, 91, 127, 95, 105, 100, 115, 32, 97, 110, 100, 32, 95, 118, 97, 108, 117, 101, 115, 32, 97, 114, 114, 97, 121, 32, 108, 101, 110, 103, 104, 116, 32, 109, 117, 129, 82, 104, 57, 186, 16, 54, 176, 186, 49, 180, 23, 96, 185, 27, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 39, 194, 96, 27, 131, 97, 44, 162, 86, 91, 127, 82, 101, 99, 105, 112, 105, 101, 110, 116, 32, 115, 104, 111, 117, 108, 100, 32, 98, 101, 32, 112, 114, 101, 115, 101, 110, 116, 0, 0, 0, 0, 0, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 39, 251, 96, 57, 131, 97, 44, 162, 86, 91, 127, 99, 111, 110, 116, 114, 97, 99, 116, 32, 114, 101, 116, 117, 114, 110, 101, 100, 32, 97, 110, 32, 117, 110, 107, 110, 111, 119, 110, 32, 118, 97, 108, 129, 82, 127, 117, 101, 32, 102, 114, 111, 109, 32, 111, 110, 69, 82, 67, 49, 49, 53, 53, 82, 101, 99, 101, 105, 118, 101, 100, 0, 0, 0, 0, 0, 0, 0, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 40, 90, 96, 21, 131, 97, 44, 162, 86, 91, 116, 47, 186, 55, 144, 54, 186, 185, 186, 16, 49, 50, 144, 55, 55, 183, 22, 189, 50, 185, 55, 151, 96, 89, 27, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 40, 139, 96, 26, 131, 97, 44, 162, 86, 91, 127, 115, 105, 103, 110, 101, 114, 32, 115, 104, 111, 117, 108, 100, 32, 115, 105, 103, 110, 32, 116, 111, 107, 101, 110, 73, 100, 0, 0, 0, 0, 0, 0, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 40, 196, 96, 17, 131, 97, 44, 162, 86, 91, 112, 29, 92, 154, 72, 28, 218, 27, 221, 91, 25, 8, 24, 153, 72, 28, 217, 93, 96, 122, 27, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 97, 34, 114, 97, 40, 240, 130, 97, 10, 154, 86, 91, 97, 10, 154, 86, 91, 97, 34, 114, 129, 97, 44, 212, 86, 91, 96, 0, 97, 41, 10, 130, 133, 97, 35, 240, 86, 91, 96, 20, 130, 1, 145, 80, 97, 41, 26, 130, 132, 97, 40, 228, 86, 91, 80, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 32, 129, 1, 97, 4, 15, 130, 132, 97, 34, 105, 86, 91, 96, 64, 129, 1, 97, 41, 64, 130, 133, 97, 34, 105, 86, 91, 97, 41, 77, 96, 32, 131, 1, 132, 97, 35, 175, 86, 91, 147, 146, 80, 80, 80, 86, 91, 96, 160, 129, 1, 97, 41, 98, 130, 136, 97, 34, 105, 86, 91, 97, 41, 111, 96, 32, 131, 1, 135, 97, 34, 105, 86, 91, 129, 129, 3, 96, 64, 131, 1, 82, 97, 41, 129, 129, 134, 97, 35, 88, 86, 91, 144, 80, 129, 129, 3, 96, 96, 131, 1, 82, 97, 41, 149, 129, 133, 97, 35, 88, 86, 91, 144, 80, 129, 129, 3, 96, 128, 131, 1, 82, 97, 41, 169, 129, 132, 97, 35, 184, 86, 91, 151, 150, 80, 80, 80, 80, 80, 80, 80, 86, 91, 96, 160, 129, 1, 97, 41, 194, 130, 136, 97, 34, 105, 86, 91, 97, 41, 207, 96, 32, 131, 1, 135, 97, 34, 105, 86, 91, 97, 41, 220, 96, 64, 131, 1, 134, 97, 35, 175, 86, 91, 97, 41, 233, 96, 96, 131, 1, 133, 97, 35, 175, 86, 91, 129, 129, 3, 96, 128, 131, 1, 82, 97, 41, 169, 129, 132, 97, 35, 184, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 41, 77, 129, 132, 97, 34, 209, 86, 91, 96, 64, 128, 130, 82, 129, 1, 97, 42, 30, 129, 134, 136, 97, 35, 31, 86, 91, 144, 80, 129, 129, 3, 96, 32, 131, 1, 82, 97, 42, 51, 129, 132, 134, 97, 35, 31, 86, 91, 150, 149, 80, 80, 80, 80, 80, 80, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 41, 77, 129, 132, 97, 35, 88, 86, 91, 96, 32, 129, 1, 97, 4, 15, 130, 132, 97, 35, 166, 86, 91, 96, 128, 129, 1, 97, 42, 106, 130, 135, 97, 35, 175, 86, 91, 97, 42, 119, 96, 32, 131, 1, 134, 97, 40, 245, 86, 91, 97, 42, 132, 96, 64, 131, 1, 133, 97, 35, 175, 86, 91, 97, 42, 145, 96, 96, 131, 1, 132, 97, 35, 175, 86, 91, 149, 148, 80, 80, 80, 80, 80, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 41, 77, 129, 132, 97, 35, 184, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 36, 1, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 36, 58, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 36, 115, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 36, 187, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 36, 244, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 37, 59, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 37, 126, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 37, 203, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 38, 28, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 38, 123, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 38, 180, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 38, 248, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 39, 49, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 39, 106, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 39, 181, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 39, 238, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 40, 77, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 40, 126, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 40, 183, 86, 91, 96, 32, 129, 1, 97, 4, 15, 130, 132, 97, 35, 175, 86, 91, 96, 96, 129, 1, 97, 43, 247, 130, 134, 97, 35, 175, 86, 91, 129, 129, 3, 96, 32, 131, 1, 82, 97, 44, 9, 129, 133, 97, 34, 120, 86, 91, 144, 80, 129, 129, 3, 96, 64, 131, 1, 82, 97, 42, 145, 129, 132, 97, 35, 88, 86, 91, 96, 64, 129, 1, 97, 41, 64, 130, 133, 97, 35, 175, 86, 91, 96, 64, 81, 129, 129, 1, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 130, 130, 16, 23, 21, 97, 44, 73, 87, 96, 0, 128, 253, 91, 96, 64, 82, 145, 144, 80, 86, 91, 96, 0, 96, 1, 96, 1, 96, 64, 27, 3, 130, 17, 21, 97, 44, 103, 87, 96, 0, 128, 253, 91, 80, 96, 32, 144, 129, 2, 1, 144, 86, 91, 96, 0, 96, 1, 96, 1, 96, 64, 27, 3, 130, 17, 21, 97, 44, 135, 87, 96, 0, 128, 253, 91, 80, 96, 32, 96, 31, 145, 144, 145, 1, 96, 31, 25, 22, 1, 144, 86, 91, 96, 32, 1, 144, 86, 91, 81, 144, 86, 91, 144, 129, 82, 96, 32, 1, 144, 86, 91, 96, 0, 97, 4, 15, 130, 97, 44, 200, 86, 91, 21, 21, 144, 86, 91, 96, 1, 96, 1, 96, 224, 27, 3, 25, 22, 144, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 22, 144, 86, 91, 96, 255, 22, 144, 86, 91, 96, 0, 97, 4, 15, 130, 97, 44, 171, 86, 91, 130, 129, 131, 55, 80, 96, 0, 145, 1, 82, 86, 91, 96, 0, 91, 131, 129, 16, 21, 97, 45, 12, 87, 129, 129, 1, 81, 131, 130, 1, 82, 96, 32, 1, 97, 44, 244, 86, 91, 131, 129, 17, 21, 97, 45, 27, 87, 96, 0, 132, 132, 1, 82, 91, 80, 80, 80, 80, 86, 91, 96, 0, 97, 4, 15, 130, 96, 0, 97, 4, 15, 130, 97, 45, 60, 86, 91, 96, 31, 1, 96, 31, 25, 22, 144, 86, 91, 96, 96, 27, 144, 86, 91, 97, 45, 75, 129, 97, 44, 171, 86, 91, 129, 20, 97, 4, 248, 87, 96, 0, 128, 253, 91, 97, 45, 75, 129, 97, 44, 182, 86, 91, 97, 45, 75, 129, 97, 10, 154, 86, 91, 97, 45, 75, 129, 97, 44, 187, 86, 91, 97, 45, 75, 129, 97, 44, 212, 86, 254, 163, 101, 98, 122, 122, 114, 49, 88, 32, 112, 99, 189, 218, 52, 161, 239, 153, 96, 81, 62, 78, 84, 154, 131, 156, 21, 193, 23, 214, 39, 16, 168, 42, 61, 224, 61, 137, 189, 46, 22, 202, 108, 101, 120, 112, 101, 114, 105, 109, 101, 110, 116, 97, 108, 245, 100, 115, 111, 108, 99, 67, 0, 5, 17, 0, 64}) + testERC1155RealWorldBytecode = ByteCode([]byte{96, 128, 96, 64, 82, 52, 128, 21, 97, 0, 16, 87, 96, 0, 128, 253, 91, 80, 96, 4, 54, 16, 97, 1, 195, 87, 96, 0, 53, 96, 224, 28, 128, 99, 149, 216, 155, 65, 17, 97, 0, 249, 87, 128, 99, 229, 200, 176, 61, 17, 97, 0, 151, 87, 128, 99, 235, 18, 214, 30, 17, 97, 0, 113, 87, 128, 99, 235, 18, 214, 30, 20, 97, 3, 159, 87, 128, 99, 242, 66, 67, 42, 20, 97, 3, 178, 87, 128, 99, 242, 253, 227, 139, 20, 97, 3, 197, 87, 128, 99, 245, 41, 138, 202, 20, 97, 3, 216, 87, 97, 1, 195, 86, 91, 128, 99, 229, 200, 176, 61, 20, 97, 3, 124, 87, 128, 99, 232, 163, 212, 133, 20, 97, 3, 132, 87, 128, 99, 233, 133, 233, 197, 20, 97, 3, 140, 87, 97, 1, 195, 86, 91, 128, 99, 185, 196, 217, 251, 17, 97, 0, 211, 87, 128, 99, 185, 196, 217, 251, 20, 97, 3, 46, 87, 128, 99, 192, 172, 153, 131, 20, 97, 3, 78, 87, 128, 99, 198, 191, 50, 98, 20, 97, 3, 86, 87, 128, 99, 205, 83, 208, 142, 20, 97, 3, 105, 87, 97, 1, 195, 86, 91, 128, 99, 149, 216, 155, 65, 20, 97, 3, 0, 87, 128, 99, 153, 224, 221, 124, 20, 97, 3, 8, 87, 128, 99, 162, 44, 180, 101, 20, 97, 3, 27, 87, 97, 1, 195, 86, 91, 128, 99, 78, 18, 115, 244, 17, 97, 1, 102, 87, 128, 99, 125, 247, 62, 39, 17, 97, 1, 64, 87, 128, 99, 125, 247, 62, 39, 20, 97, 2, 189, 87, 128, 99, 141, 165, 203, 91, 20, 97, 2, 208, 87, 128, 99, 143, 50, 213, 155, 20, 97, 2, 229, 87, 128, 99, 147, 142, 61, 123, 20, 97, 2, 237, 87, 97, 1, 195, 86, 91, 128, 99, 78, 18, 115, 244, 20, 97, 2, 129, 87, 128, 99, 99, 8, 241, 205, 20, 97, 2, 148, 87, 128, 99, 113, 80, 24, 166, 20, 97, 2, 181, 87, 97, 1, 195, 86, 91, 128, 99, 14, 49, 106, 183, 17, 97, 1, 162, 87, 128, 99, 14, 49, 106, 183, 20, 97, 2, 38, 87, 128, 99, 14, 137, 52, 28, 20, 97, 2, 59, 87, 128, 99, 14, 189, 76, 127, 20, 97, 2, 78, 87, 128, 99, 46, 178, 194, 214, 20, 97, 2, 110, 87, 97, 1, 195, 86, 91, 128, 98, 253, 213, 142, 20, 97, 1, 200, 87, 128, 99, 1, 255, 201, 167, 20, 97, 1, 241, 87, 128, 99, 6, 253, 222, 3, 20, 97, 2, 17, 87, 91, 96, 0, 128, 253, 91, 97, 1, 219, 97, 1, 214, 54, 96, 4, 97, 31, 231, 86, 91, 97, 3, 235, 86, 91, 96, 64, 81, 97, 1, 232, 145, 144, 97, 43, 219, 86, 91, 96, 64, 81, 128, 145, 3, 144, 243, 91, 97, 2, 4, 97, 1, 255, 54, 96, 4, 97, 32, 210, 86, 91, 97, 4, 21, 86, 91, 96, 64, 81, 97, 1, 232, 145, 144, 97, 42, 78, 86, 91, 97, 2, 25, 97, 4, 52, 86, 91, 96, 64, 81, 97, 1, 232, 145, 144, 97, 42, 154, 86, 91, 97, 2, 57, 97, 2, 52, 54, 96, 4, 97, 30, 9, 86, 91, 97, 4, 194, 86, 91, 0, 91, 97, 2, 25, 97, 2, 73, 54, 96, 4, 97, 33, 66, 86, 91, 97, 4, 251, 86, 91, 97, 2, 97, 97, 2, 92, 54, 96, 4, 97, 33, 66, 86, 91, 97, 5, 6, 86, 91, 96, 64, 81, 97, 1, 232, 145, 144, 97, 42, 61, 86, 91, 97, 2, 57, 97, 2, 124, 54, 96, 4, 97, 30, 97, 86, 91, 97, 5, 249, 86, 91, 97, 2, 97, 97, 2, 143, 54, 96, 4, 97, 32, 100, 86, 91, 97, 8, 239, 86, 91, 97, 2, 167, 97, 2, 162, 54, 96, 4, 97, 33, 96, 86, 91, 97, 9, 201, 86, 91, 96, 64, 81, 97, 1, 232, 146, 145, 144, 97, 41, 50, 86, 91, 97, 2, 57, 97, 10, 12, 86, 91, 97, 2, 4, 97, 2, 203, 54, 96, 4, 97, 30, 9, 86, 91, 97, 10, 122, 86, 91, 97, 2, 216, 97, 10, 141, 86, 91, 96, 64, 81, 97, 1, 232, 145, 144, 97, 41, 36, 86, 91, 97, 2, 4, 97, 10, 157, 86, 91, 97, 2, 57, 97, 2, 251, 54, 96, 4, 97, 33, 14, 86, 91, 97, 10, 195, 86, 91, 97, 2, 25, 97, 10, 240, 86, 91, 97, 2, 57, 97, 3, 22, 54, 96, 4, 97, 33, 14, 86, 91, 97, 11, 75, 86, 91, 97, 2, 57, 97, 3, 41, 54, 96, 4, 97, 31, 183, 86, 91, 97, 11, 120, 86, 91, 97, 3, 65, 97, 3, 60, 54, 96, 4, 97, 33, 66, 86, 91, 97, 11, 231, 86, 91, 96, 64, 81, 97, 1, 232, 145, 144, 97, 41, 251, 86, 91, 97, 2, 25, 97, 12, 223, 86, 91, 97, 2, 57, 97, 3, 100, 54, 96, 4, 97, 33, 127, 86, 91, 97, 13, 58, 86, 91, 97, 2, 216, 97, 3, 119, 54, 96, 4, 97, 33, 66, 86, 91, 97, 13, 118, 86, 91, 97, 2, 57, 97, 13, 145, 86, 91, 97, 2, 25, 97, 13, 163, 86, 91, 97, 2, 4, 97, 3, 154, 54, 96, 4, 97, 30, 39, 86, 91, 97, 13, 254, 86, 91, 97, 2, 57, 97, 3, 173, 54, 96, 4, 97, 30, 9, 86, 91, 97, 14, 44, 86, 91, 97, 2, 57, 97, 3, 192, 54, 96, 4, 97, 31, 40, 86, 91, 97, 14, 89, 86, 91, 97, 2, 57, 97, 3, 211, 54, 96, 4, 97, 30, 9, 86, 91, 97, 16, 19, 86, 91, 97, 2, 57, 97, 3, 230, 54, 96, 4, 97, 32, 23, 86, 91, 97, 16, 64, 86, 91, 96, 0, 129, 129, 82, 96, 6, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 96, 1, 96, 1, 96, 160, 27, 3, 134, 22, 132, 82, 144, 145, 82, 144, 32, 84, 91, 146, 145, 80, 80, 86, 91, 96, 1, 96, 1, 96, 224, 27, 3, 25, 22, 96, 0, 144, 129, 82, 96, 32, 129, 144, 82, 96, 64, 144, 32, 84, 96, 255, 22, 144, 86, 91, 96, 10, 128, 84, 96, 64, 128, 81, 96, 32, 96, 2, 96, 1, 133, 22, 21, 97, 1, 0, 2, 96, 0, 25, 1, 144, 148, 22, 147, 144, 147, 4, 96, 31, 129, 1, 132, 144, 4, 132, 2, 130, 1, 132, 1, 144, 146, 82, 129, 129, 82, 146, 145, 131, 1, 130, 130, 128, 21, 97, 4, 186, 87, 128, 96, 31, 16, 97, 4, 143, 87, 97, 1, 0, 128, 131, 84, 4, 2, 131, 82, 145, 96, 32, 1, 145, 97, 4, 186, 86, 91, 130, 1, 145, 144, 96, 0, 82, 96, 32, 96, 0, 32, 144, 91, 129, 84, 129, 82, 144, 96, 1, 1, 144, 96, 32, 1, 128, 131, 17, 97, 4, 157, 87, 130, 144, 3, 96, 31, 22, 130, 1, 145, 91, 80, 80, 80, 80, 80, 129, 86, 91, 97, 4, 202, 97, 10, 157, 86, 91, 97, 4, 239, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 59, 86, 91, 96, 64, 81, 128, 145, 3, 144, 253, 91, 97, 4, 248, 129, 97, 17, 56, 86, 91, 80, 86, 91, 96, 96, 97, 4, 15, 130, 97, 17, 128, 86, 91, 96, 0, 129, 129, 82, 96, 9, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 128, 84, 130, 81, 129, 133, 2, 129, 1, 133, 1, 144, 147, 82, 128, 131, 82, 96, 96, 148, 133, 148, 132, 1, 91, 130, 130, 16, 21, 97, 5, 120, 87, 96, 0, 132, 129, 82, 96, 32, 144, 129, 144, 32, 96, 64, 128, 81, 128, 130, 1, 144, 145, 82, 96, 2, 133, 2, 144, 145, 1, 128, 84, 96, 1, 96, 1, 96, 160, 27, 3, 22, 130, 82, 96, 1, 144, 129, 1, 84, 130, 132, 1, 82, 144, 131, 82, 144, 146, 1, 145, 1, 97, 5, 48, 86, 91, 80, 80, 80, 80, 144, 80, 96, 96, 129, 81, 96, 64, 81, 144, 128, 130, 82, 128, 96, 32, 2, 96, 32, 1, 130, 1, 96, 64, 82, 128, 21, 97, 5, 171, 87, 129, 96, 32, 1, 96, 32, 130, 2, 128, 56, 131, 57, 1, 144, 80, 91, 80, 144, 80, 96, 0, 91, 130, 81, 129, 16, 21, 97, 5, 241, 87, 130, 129, 129, 81, 129, 16, 97, 5, 198, 87, 254, 91, 96, 32, 2, 96, 32, 1, 1, 81, 96, 32, 1, 81, 130, 130, 129, 81, 129, 16, 97, 5, 222, 87, 254, 91, 96, 32, 144, 129, 2, 145, 144, 145, 1, 1, 82, 96, 1, 1, 97, 5, 177, 86, 91, 80, 147, 146, 80, 80, 80, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 135, 22, 97, 6, 31, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 42, 235, 86, 91, 132, 131, 20, 97, 6, 62, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 123, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 136, 22, 51, 20, 128, 97, 6, 125, 87, 80, 96, 1, 96, 1, 96, 160, 27, 3, 136, 22, 96, 0, 144, 129, 82, 96, 7, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 51, 132, 82, 144, 145, 82, 144, 32, 84, 96, 255, 22, 21, 21, 96, 1, 20, 91, 97, 6, 153, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 27, 86, 91, 96, 0, 91, 133, 129, 16, 21, 97, 7, 206, 87, 96, 0, 135, 135, 131, 129, 129, 16, 97, 6, 178, 87, 254, 91, 144, 80, 96, 32, 2, 1, 53, 144, 80, 96, 0, 134, 134, 132, 129, 129, 16, 97, 6, 201, 87, 254, 91, 144, 80, 96, 32, 2, 1, 53, 144, 80, 97, 7, 27, 129, 96, 6, 96, 0, 133, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 96, 0, 32, 96, 0, 142, 96, 1, 96, 1, 96, 160, 27, 3, 22, 96, 1, 96, 1, 96, 160, 27, 3, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 96, 0, 32, 84, 97, 18, 187, 144, 145, 144, 99, 255, 255, 255, 255, 22, 86, 91, 96, 6, 96, 0, 132, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 96, 0, 32, 96, 0, 141, 96, 1, 96, 1, 96, 160, 27, 3, 22, 96, 1, 96, 1, 96, 160, 27, 3, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 96, 0, 32, 129, 144, 85, 80, 97, 7, 158, 96, 6, 96, 0, 132, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 96, 0, 32, 96, 0, 140, 96, 1, 96, 1, 96, 160, 27, 3, 22, 96, 1, 96, 1, 96, 160, 27, 3, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 96, 0, 32, 84, 130, 97, 18, 205, 144, 145, 144, 99, 255, 255, 255, 255, 22, 86, 91, 96, 0, 146, 131, 82, 96, 6, 96, 32, 144, 129, 82, 96, 64, 128, 133, 32, 96, 1, 96, 1, 96, 160, 27, 3, 142, 22, 134, 82, 144, 145, 82, 144, 146, 32, 145, 144, 145, 85, 80, 96, 1, 1, 97, 6, 156, 86, 91, 80, 134, 96, 1, 96, 1, 96, 160, 27, 3, 22, 136, 96, 1, 96, 1, 96, 160, 27, 3, 22, 51, 96, 1, 96, 1, 96, 160, 27, 3, 22, 127, 74, 57, 220, 6, 212, 192, 219, 198, 75, 112, 175, 144, 253, 105, 138, 35, 58, 81, 138, 165, 208, 126, 89, 93, 152, 59, 140, 5, 38, 200, 247, 251, 137, 137, 137, 137, 96, 64, 81, 97, 8, 34, 148, 147, 146, 145, 144, 97, 42, 12, 86, 91, 96, 64, 81, 128, 145, 3, 144, 164, 97, 8, 60, 135, 96, 1, 96, 1, 96, 160, 27, 3, 22, 97, 18, 218, 86, 91, 21, 97, 8, 229, 87, 97, 8, 229, 51, 137, 137, 137, 137, 128, 128, 96, 32, 2, 96, 32, 1, 96, 64, 81, 144, 129, 1, 96, 64, 82, 128, 147, 146, 145, 144, 129, 129, 82, 96, 32, 1, 131, 131, 96, 32, 2, 128, 130, 132, 55, 96, 0, 146, 1, 145, 144, 145, 82, 80, 80, 96, 64, 128, 81, 96, 32, 128, 141, 2, 130, 129, 1, 130, 1, 144, 147, 82, 140, 130, 82, 144, 147, 80, 140, 146, 80, 139, 145, 130, 145, 133, 1, 144, 132, 144, 128, 130, 132, 55, 96, 0, 146, 1, 145, 144, 145, 82, 80, 80, 96, 64, 128, 81, 96, 32, 96, 31, 140, 1, 129, 144, 4, 129, 2, 130, 1, 129, 1, 144, 146, 82, 138, 129, 82, 146, 80, 138, 145, 80, 137, 144, 129, 144, 132, 1, 131, 130, 128, 130, 132, 55, 96, 0, 146, 1, 145, 144, 145, 82, 80, 97, 19, 22, 146, 80, 80, 80, 86, 91, 80, 80, 80, 80, 80, 80, 80, 80, 86, 91, 96, 96, 131, 130, 20, 97, 8, 253, 87, 96, 0, 128, 253, 91, 96, 64, 128, 81, 133, 129, 82, 96, 32, 128, 135, 2, 130, 1, 1, 144, 145, 82, 96, 96, 144, 133, 128, 21, 97, 9, 41, 87, 129, 96, 32, 1, 96, 32, 130, 2, 128, 56, 131, 57, 1, 144, 80, 91, 80, 144, 80, 96, 0, 91, 133, 129, 16, 21, 97, 9, 191, 87, 96, 6, 96, 0, 134, 134, 132, 129, 129, 16, 97, 9, 71, 87, 254, 91, 144, 80, 96, 32, 2, 1, 53, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 96, 0, 32, 96, 0, 136, 136, 132, 129, 129, 16, 97, 9, 106, 87, 254, 91, 144, 80, 96, 32, 2, 1, 96, 32, 97, 9, 127, 145, 144, 129, 1, 144, 97, 30, 9, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 22, 96, 1, 96, 1, 96, 160, 27, 3, 22, 129, 82, 96, 32, 1, 144, 129, 82, 96, 32, 1, 96, 0, 32, 84, 130, 130, 129, 81, 129, 16, 97, 9, 172, 87, 254, 91, 96, 32, 144, 129, 2, 145, 144, 145, 1, 1, 82, 96, 1, 1, 97, 9, 47, 86, 91, 80, 149, 148, 80, 80, 80, 80, 80, 86, 91, 96, 9, 96, 32, 82, 129, 96, 0, 82, 96, 64, 96, 0, 32, 129, 129, 84, 129, 16, 97, 9, 226, 87, 254, 91, 96, 0, 145, 130, 82, 96, 32, 144, 145, 32, 96, 2, 144, 145, 2, 1, 128, 84, 96, 1, 144, 145, 1, 84, 96, 1, 96, 1, 96, 160, 27, 3, 144, 145, 22, 146, 80, 144, 80, 130, 86, 91, 97, 10, 20, 97, 10, 157, 86, 91, 97, 10, 48, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 59, 86, 91, 96, 1, 84, 96, 64, 81, 96, 0, 145, 96, 1, 96, 1, 96, 160, 27, 3, 22, 144, 127, 139, 224, 7, 156, 83, 22, 89, 20, 19, 68, 205, 31, 208, 164, 242, 132, 25, 73, 127, 151, 34, 163, 218, 175, 227, 180, 24, 111, 107, 100, 87, 224, 144, 131, 144, 163, 96, 1, 128, 84, 96, 1, 96, 1, 96, 160, 27, 3, 25, 22, 144, 85, 86, 91, 96, 0, 97, 4, 15, 96, 2, 131, 99, 255, 255, 255, 255, 97, 19, 197, 22, 86, 91, 96, 1, 84, 96, 1, 96, 1, 96, 160, 27, 3, 22, 91, 144, 86, 91, 96, 1, 84, 96, 0, 144, 96, 1, 96, 1, 96, 160, 27, 3, 22, 97, 10, 180, 97, 20, 13, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 22, 20, 144, 80, 144, 86, 91, 97, 10, 203, 97, 10, 157, 86, 91, 97, 10, 231, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 59, 86, 91, 97, 4, 248, 129, 97, 20, 17, 86, 91, 96, 11, 128, 84, 96, 64, 128, 81, 96, 32, 96, 2, 96, 1, 133, 22, 21, 97, 1, 0, 2, 96, 0, 25, 1, 144, 148, 22, 147, 144, 147, 4, 96, 31, 129, 1, 132, 144, 4, 132, 2, 130, 1, 132, 1, 144, 146, 82, 129, 129, 82, 146, 145, 131, 1, 130, 130, 128, 21, 97, 4, 186, 87, 128, 96, 31, 16, 97, 4, 143, 87, 97, 1, 0, 128, 131, 84, 4, 2, 131, 82, 145, 96, 32, 1, 145, 97, 4, 186, 86, 91, 97, 11, 83, 97, 10, 157, 86, 91, 97, 11, 111, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 59, 86, 91, 97, 4, 248, 129, 97, 20, 40, 86, 91, 51, 96, 0, 129, 129, 82, 96, 7, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 96, 1, 96, 1, 96, 160, 27, 3, 135, 22, 128, 133, 82, 146, 82, 145, 130, 144, 32, 128, 84, 96, 255, 25, 22, 133, 21, 21, 23, 144, 85, 144, 81, 144, 145, 144, 127, 23, 48, 126, 171, 57, 171, 97, 7, 232, 137, 152, 69, 173, 61, 89, 189, 150, 83, 242, 0, 242, 32, 146, 4, 137, 202, 43, 89, 55, 105, 108, 49, 144, 97, 11, 219, 144, 133, 144, 97, 42, 78, 86, 91, 96, 64, 81, 128, 145, 3, 144, 163, 80, 80, 86, 91, 96, 0, 129, 129, 82, 96, 9, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 128, 84, 130, 81, 129, 133, 2, 129, 1, 133, 1, 144, 147, 82, 128, 131, 82, 96, 96, 148, 133, 148, 132, 1, 91, 130, 130, 16, 21, 97, 12, 89, 87, 96, 0, 132, 129, 82, 96, 32, 144, 129, 144, 32, 96, 64, 128, 81, 128, 130, 1, 144, 145, 82, 96, 2, 133, 2, 144, 145, 1, 128, 84, 96, 1, 96, 1, 96, 160, 27, 3, 22, 130, 82, 96, 1, 144, 129, 1, 84, 130, 132, 1, 82, 144, 131, 82, 144, 146, 1, 145, 1, 97, 12, 17, 86, 91, 80, 80, 80, 80, 144, 80, 96, 96, 129, 81, 96, 64, 81, 144, 128, 130, 82, 128, 96, 32, 2, 96, 32, 1, 130, 1, 96, 64, 82, 128, 21, 97, 12, 140, 87, 129, 96, 32, 1, 96, 32, 130, 2, 128, 56, 131, 57, 1, 144, 80, 91, 80, 144, 80, 96, 0, 91, 130, 81, 129, 16, 21, 97, 5, 241, 87, 130, 129, 129, 81, 129, 16, 97, 12, 167, 87, 254, 91, 96, 32, 2, 96, 32, 1, 1, 81, 96, 0, 1, 81, 130, 130, 129, 81, 129, 16, 97, 12, 191, 87, 254, 91, 96, 1, 96, 1, 96, 160, 27, 3, 144, 146, 22, 96, 32, 146, 131, 2, 145, 144, 145, 1, 144, 145, 1, 82, 96, 1, 1, 97, 12, 146, 86, 91, 96, 3, 128, 84, 96, 64, 128, 81, 96, 32, 96, 2, 96, 1, 133, 22, 21, 97, 1, 0, 2, 96, 0, 25, 1, 144, 148, 22, 147, 144, 147, 4, 96, 31, 129, 1, 132, 144, 4, 132, 2, 130, 1, 132, 1, 144, 146, 82, 129, 129, 82, 146, 145, 131, 1, 130, 130, 128, 21, 97, 4, 186, 87, 128, 96, 31, 16, 97, 4, 143, 87, 97, 1, 0, 128, 131, 84, 4, 2, 131, 82, 145, 96, 32, 1, 145, 97, 4, 186, 86, 91, 97, 13, 66, 97, 10, 157, 86, 91, 97, 13, 94, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 59, 86, 91, 97, 13, 109, 135, 135, 135, 135, 135, 135, 135, 97, 20, 59, 86, 91, 80, 80, 80, 80, 80, 80, 80, 86, 91, 96, 8, 96, 32, 82, 96, 0, 144, 129, 82, 96, 64, 144, 32, 84, 96, 1, 96, 1, 96, 160, 27, 3, 22, 129, 86, 91, 97, 13, 161, 97, 13, 156, 97, 20, 13, 86, 91, 97, 17, 56, 86, 91, 86, 91, 96, 5, 128, 84, 96, 64, 128, 81, 96, 32, 96, 2, 96, 1, 133, 22, 21, 97, 1, 0, 2, 96, 0, 25, 1, 144, 148, 22, 147, 144, 147, 4, 96, 31, 129, 1, 132, 144, 4, 132, 2, 130, 1, 132, 1, 144, 146, 82, 129, 129, 82, 146, 145, 131, 1, 130, 130, 128, 21, 97, 4, 186, 87, 128, 96, 31, 16, 97, 4, 143, 87, 97, 1, 0, 128, 131, 84, 4, 2, 131, 82, 145, 96, 32, 1, 145, 97, 4, 186, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 145, 130, 22, 96, 0, 144, 129, 82, 96, 7, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 147, 144, 148, 22, 130, 82, 145, 144, 145, 82, 32, 84, 96, 255, 22, 144, 86, 91, 97, 14, 52, 97, 10, 157, 86, 91, 97, 14, 80, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 59, 86, 91, 97, 4, 248, 129, 97, 20, 226, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 133, 22, 97, 14, 127, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 171, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 134, 22, 51, 20, 128, 97, 14, 190, 87, 80, 96, 1, 96, 1, 96, 160, 27, 3, 134, 22, 96, 0, 144, 129, 82, 96, 7, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 51, 132, 82, 144, 145, 82, 144, 32, 84, 96, 255, 22, 21, 21, 96, 1, 20, 91, 97, 14, 218, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 27, 86, 91, 96, 0, 132, 129, 82, 96, 6, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 96, 1, 96, 1, 96, 160, 27, 3, 138, 22, 132, 82, 144, 145, 82, 144, 32, 84, 97, 15, 13, 144, 132, 99, 255, 255, 255, 255, 97, 18, 187, 22, 86, 91, 96, 0, 133, 129, 82, 96, 6, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 96, 1, 96, 1, 96, 160, 27, 3, 139, 129, 22, 133, 82, 146, 82, 128, 131, 32, 147, 144, 147, 85, 135, 22, 129, 82, 32, 84, 97, 15, 69, 144, 132, 144, 97, 18, 205, 86, 91, 96, 0, 133, 129, 82, 96, 6, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 96, 1, 96, 1, 96, 160, 27, 3, 128, 139, 22, 128, 134, 82, 145, 144, 147, 82, 146, 129, 144, 32, 147, 144, 147, 85, 145, 81, 144, 145, 136, 22, 144, 51, 144, 127, 195, 213, 129, 104, 197, 174, 115, 151, 115, 29, 6, 61, 91, 191, 61, 101, 120, 84, 66, 115, 67, 244, 192, 131, 36, 15, 122, 172, 170, 45, 15, 98, 144, 97, 15, 168, 144, 137, 144, 137, 144, 97, 44, 29, 86, 91, 96, 64, 81, 128, 145, 3, 144, 164, 97, 15, 194, 133, 96, 1, 96, 1, 96, 160, 27, 3, 22, 97, 18, 218, 86, 91, 21, 97, 16, 11, 87, 97, 16, 11, 51, 135, 135, 135, 135, 135, 135, 128, 128, 96, 31, 1, 96, 32, 128, 145, 4, 2, 96, 32, 1, 96, 64, 81, 144, 129, 1, 96, 64, 82, 128, 147, 146, 145, 144, 129, 129, 82, 96, 32, 1, 131, 131, 128, 130, 132, 55, 96, 0, 146, 1, 145, 144, 145, 82, 80, 97, 21, 42, 146, 80, 80, 80, 86, 91, 80, 80, 80, 80, 80, 80, 86, 91, 97, 16, 27, 97, 10, 157, 86, 91, 97, 16, 55, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 59, 86, 91, 97, 4, 248, 129, 97, 21, 217, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 131, 22, 51, 20, 128, 97, 16, 127, 87, 80, 96, 1, 96, 1, 96, 160, 27, 3, 131, 22, 96, 0, 144, 129, 82, 96, 7, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 51, 132, 82, 144, 145, 82, 144, 32, 84, 96, 255, 22, 21, 21, 96, 1, 20, 91, 97, 16, 155, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 11, 86, 91, 96, 0, 130, 129, 82, 96, 6, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 96, 1, 96, 1, 96, 160, 27, 3, 135, 22, 132, 82, 144, 145, 82, 144, 32, 84, 97, 16, 206, 144, 130, 99, 255, 255, 255, 255, 97, 18, 187, 22, 86, 91, 96, 0, 131, 129, 82, 96, 6, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 96, 1, 96, 1, 96, 160, 27, 3, 136, 22, 128, 133, 82, 146, 82, 128, 131, 32, 147, 144, 147, 85, 145, 81, 144, 145, 144, 51, 144, 127, 195, 213, 129, 104, 197, 174, 115, 151, 115, 29, 6, 61, 91, 191, 61, 101, 120, 84, 66, 115, 67, 244, 192, 131, 36, 15, 122, 172, 170, 45, 15, 98, 144, 97, 17, 43, 144, 135, 144, 135, 144, 97, 44, 29, 86, 91, 96, 64, 81, 128, 145, 3, 144, 164, 80, 80, 80, 86, 91, 97, 17, 73, 96, 2, 130, 99, 255, 255, 255, 255, 97, 22, 91, 22, 86, 91, 96, 64, 81, 96, 1, 96, 1, 96, 160, 27, 3, 130, 22, 144, 127, 53, 37, 226, 40, 36, 168, 167, 223, 44, 154, 96, 41, 148, 28, 130, 76, 249, 91, 100, 71, 241, 225, 61, 81, 40, 253, 56, 38, 211, 90, 254, 139, 144, 96, 0, 144, 162, 80, 86, 91, 96, 0, 129, 129, 82, 96, 4, 96, 32, 144, 129, 82, 96, 64, 145, 130, 144, 32, 128, 84, 131, 81, 96, 2, 96, 1, 131, 22, 21, 97, 1, 0, 2, 96, 0, 25, 1, 144, 146, 22, 145, 144, 145, 4, 96, 31, 129, 1, 132, 144, 4, 132, 2, 130, 1, 132, 1, 144, 148, 82, 131, 129, 82, 96, 96, 147, 97, 4, 15, 147, 145, 146, 145, 131, 1, 130, 130, 128, 21, 97, 18, 26, 87, 128, 96, 31, 16, 97, 17, 239, 87, 97, 1, 0, 128, 131, 84, 4, 2, 131, 82, 145, 96, 32, 1, 145, 97, 18, 26, 86, 91, 130, 1, 145, 144, 96, 0, 82, 96, 32, 96, 0, 32, 144, 91, 129, 84, 129, 82, 144, 96, 1, 1, 144, 96, 32, 1, 128, 131, 17, 97, 17, 253, 87, 130, 144, 3, 96, 31, 22, 130, 1, 145, 91, 80, 80, 96, 3, 128, 84, 96, 64, 128, 81, 96, 32, 96, 31, 96, 2, 96, 0, 25, 97, 1, 0, 96, 1, 136, 22, 21, 2, 1, 144, 149, 22, 148, 144, 148, 4, 147, 132, 1, 129, 144, 4, 129, 2, 130, 1, 129, 1, 144, 146, 82, 130, 129, 82, 149, 80, 145, 147, 80, 145, 80, 131, 1, 130, 130, 128, 21, 97, 18, 168, 87, 128, 96, 31, 16, 97, 18, 125, 87, 97, 1, 0, 128, 131, 84, 4, 2, 131, 82, 145, 96, 32, 1, 145, 97, 18, 168, 86, 91, 130, 1, 145, 144, 96, 0, 82, 96, 32, 96, 0, 32, 144, 91, 129, 84, 129, 82, 144, 96, 1, 1, 144, 96, 32, 1, 128, 131, 17, 97, 18, 139, 87, 130, 144, 3, 96, 31, 22, 130, 1, 145, 91, 80, 80, 80, 80, 80, 97, 22, 163, 144, 145, 144, 99, 255, 255, 255, 255, 22, 86, 91, 96, 0, 130, 130, 17, 21, 97, 18, 199, 87, 254, 91, 80, 144, 3, 144, 86, 91, 129, 129, 1, 130, 129, 16, 21, 97, 4, 15, 87, 254, 91, 96, 0, 129, 63, 127, 197, 210, 70, 1, 134, 247, 35, 60, 146, 126, 125, 178, 220, 199, 3, 192, 229, 0, 182, 83, 202, 130, 39, 59, 123, 250, 216, 4, 93, 133, 164, 112, 129, 129, 20, 128, 21, 144, 97, 19, 14, 87, 80, 129, 21, 21, 91, 148, 147, 80, 80, 80, 80, 86, 91, 96, 64, 81, 99, 188, 25, 124, 129, 96, 224, 27, 128, 130, 82, 144, 96, 1, 96, 1, 96, 160, 27, 3, 134, 22, 144, 99, 188, 25, 124, 129, 144, 97, 19, 76, 144, 138, 144, 138, 144, 137, 144, 137, 144, 137, 144, 96, 4, 1, 97, 41, 84, 86, 91, 96, 32, 96, 64, 81, 128, 131, 3, 129, 96, 0, 135, 128, 59, 21, 128, 21, 97, 19, 102, 87, 96, 0, 128, 253, 91, 80, 90, 241, 21, 128, 21, 97, 19, 122, 87, 61, 96, 0, 128, 62, 61, 96, 0, 253, 91, 80, 80, 80, 80, 96, 64, 81, 61, 96, 31, 25, 96, 31, 130, 1, 22, 130, 1, 128, 96, 64, 82, 80, 97, 19, 158, 145, 144, 129, 1, 144, 97, 32, 240, 86, 91, 96, 1, 96, 1, 96, 224, 27, 3, 25, 22, 20, 97, 16, 11, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 43, 86, 91, 96, 0, 96, 1, 96, 1, 96, 160, 27, 3, 130, 22, 97, 19, 237, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 75, 86, 91, 80, 96, 1, 96, 1, 96, 160, 27, 3, 22, 96, 0, 144, 129, 82, 96, 32, 145, 144, 145, 82, 96, 64, 144, 32, 84, 96, 255, 22, 144, 86, 91, 51, 144, 86, 91, 128, 81, 97, 20, 36, 144, 96, 5, 144, 96, 32, 132, 1, 144, 97, 27, 143, 86, 91, 80, 80, 86, 91, 128, 81, 97, 20, 36, 144, 96, 3, 144, 96, 32, 132, 1, 144, 97, 27, 143, 86, 91, 97, 20, 186, 96, 1, 48, 137, 96, 64, 81, 96, 32, 1, 97, 20, 83, 146, 145, 144, 97, 40, 254, 86, 91, 96, 64, 81, 96, 32, 129, 131, 3, 3, 129, 82, 144, 96, 64, 82, 128, 81, 144, 96, 32, 1, 32, 136, 136, 136, 96, 64, 81, 96, 0, 129, 82, 96, 32, 1, 96, 64, 82, 96, 64, 81, 97, 20, 137, 148, 147, 146, 145, 144, 97, 42, 92, 86, 91, 96, 32, 96, 64, 81, 96, 32, 129, 3, 144, 128, 132, 3, 144, 133, 90, 250, 21, 128, 21, 97, 20, 171, 87, 61, 96, 0, 128, 62, 61, 96, 0, 253, 91, 80, 80, 80, 96, 32, 96, 64, 81, 3, 81, 97, 10, 122, 86, 91, 97, 20, 214, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 187, 86, 91, 97, 13, 109, 135, 132, 132, 132, 97, 23, 152, 86, 91, 97, 20, 243, 96, 2, 130, 99, 255, 255, 255, 255, 97, 26, 230, 22, 86, 91, 96, 64, 81, 96, 1, 96, 1, 96, 160, 27, 3, 130, 22, 144, 127, 71, 209, 194, 42, 37, 187, 58, 93, 78, 72, 27, 155, 30, 105, 68, 194, 234, 222, 49, 129, 160, 162, 11, 73, 94, 214, 29, 53, 181, 50, 63, 36, 144, 96, 0, 144, 162, 80, 86, 91, 96, 64, 81, 99, 242, 58, 110, 97, 96, 224, 27, 128, 130, 82, 144, 96, 1, 96, 1, 96, 160, 27, 3, 134, 22, 144, 99, 242, 58, 110, 97, 144, 97, 21, 96, 144, 138, 144, 138, 144, 137, 144, 137, 144, 137, 144, 96, 4, 1, 97, 41, 180, 86, 91, 96, 32, 96, 64, 81, 128, 131, 3, 129, 96, 0, 135, 128, 59, 21, 128, 21, 97, 21, 122, 87, 96, 0, 128, 253, 91, 80, 90, 241, 21, 128, 21, 97, 21, 142, 87, 61, 96, 0, 128, 62, 61, 96, 0, 253, 91, 80, 80, 80, 80, 96, 64, 81, 61, 96, 31, 25, 96, 31, 130, 1, 22, 130, 1, 128, 96, 64, 82, 80, 97, 21, 178, 145, 144, 129, 1, 144, 97, 32, 240, 86, 91, 96, 1, 96, 1, 96, 224, 27, 3, 25, 22, 20, 97, 16, 11, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 155, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 129, 22, 97, 21, 255, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 42, 203, 86, 91, 96, 1, 84, 96, 64, 81, 96, 1, 96, 1, 96, 160, 27, 3, 128, 132, 22, 146, 22, 144, 127, 139, 224, 7, 156, 83, 22, 89, 20, 19, 68, 205, 31, 208, 164, 242, 132, 25, 73, 127, 151, 34, 163, 218, 175, 227, 180, 24, 111, 107, 100, 87, 224, 144, 96, 0, 144, 163, 96, 1, 128, 84, 96, 1, 96, 1, 96, 160, 27, 3, 25, 22, 96, 1, 96, 1, 96, 160, 27, 3, 146, 144, 146, 22, 145, 144, 145, 23, 144, 85, 86, 91, 97, 22, 101, 130, 130, 97, 19, 197, 86, 91, 97, 22, 129, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 42, 251, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 22, 96, 0, 144, 129, 82, 96, 32, 145, 144, 145, 82, 96, 64, 144, 32, 128, 84, 96, 255, 25, 22, 144, 85, 86, 91, 96, 96, 128, 131, 144, 80, 96, 96, 131, 144, 80, 96, 96, 129, 81, 131, 81, 1, 96, 64, 81, 144, 128, 130, 82, 128, 96, 31, 1, 96, 31, 25, 22, 96, 32, 1, 130, 1, 96, 64, 82, 128, 21, 97, 22, 223, 87, 96, 32, 130, 1, 129, 128, 56, 131, 57, 1, 144, 80, 91, 80, 144, 80, 96, 0, 128, 91, 132, 81, 129, 16, 21, 97, 23, 55, 87, 132, 129, 129, 81, 129, 16, 97, 22, 251, 87, 254, 91, 96, 32, 1, 1, 81, 96, 248, 28, 96, 248, 27, 131, 131, 128, 96, 1, 1, 148, 80, 129, 81, 129, 16, 97, 23, 24, 87, 254, 91, 96, 32, 1, 1, 144, 96, 1, 96, 1, 96, 248, 27, 3, 25, 22, 144, 129, 96, 0, 26, 144, 83, 80, 96, 1, 1, 97, 22, 230, 86, 91, 80, 96, 0, 91, 131, 81, 129, 16, 21, 97, 23, 140, 87, 131, 129, 129, 81, 129, 16, 97, 23, 80, 87, 254, 91, 96, 32, 1, 1, 81, 96, 248, 28, 96, 248, 27, 131, 131, 128, 96, 1, 1, 148, 80, 129, 81, 129, 16, 97, 23, 109, 87, 254, 91, 96, 32, 1, 1, 144, 96, 1, 96, 1, 96, 248, 27, 3, 25, 22, 144, 129, 96, 0, 26, 144, 83, 80, 96, 1, 1, 97, 23, 59, 86, 91, 80, 144, 150, 149, 80, 80, 80, 80, 80, 80, 86, 91, 96, 0, 132, 129, 82, 96, 8, 96, 32, 82, 96, 64, 144, 32, 84, 96, 1, 96, 1, 96, 160, 27, 3, 22, 21, 97, 23, 205, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 91, 86, 91, 129, 97, 23, 234, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 107, 86, 91, 96, 0, 129, 81, 17, 97, 24, 11, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 203, 86, 91, 96, 0, 132, 129, 82, 96, 8, 96, 32, 144, 129, 82, 96, 64, 145, 130, 144, 32, 128, 84, 96, 1, 96, 1, 96, 160, 27, 3, 25, 22, 51, 23, 144, 85, 132, 81, 130, 81, 129, 129, 82, 129, 131, 2, 129, 1, 144, 146, 1, 144, 146, 82, 96, 96, 145, 128, 21, 97, 24, 88, 87, 129, 96, 32, 1, 96, 32, 130, 2, 128, 56, 131, 57, 1, 144, 80, 91, 80, 144, 80, 96, 96, 132, 81, 96, 64, 81, 144, 128, 130, 82, 128, 96, 32, 2, 96, 32, 1, 130, 1, 96, 64, 82, 128, 21, 97, 24, 136, 87, 129, 96, 32, 1, 96, 32, 130, 2, 128, 56, 131, 57, 1, 144, 80, 91, 80, 144, 80, 96, 0, 91, 133, 81, 129, 16, 21, 97, 25, 251, 87, 96, 0, 96, 1, 96, 1, 96, 160, 27, 3, 22, 134, 130, 129, 81, 129, 16, 97, 24, 174, 87, 254, 91, 96, 32, 2, 96, 32, 1, 1, 81, 96, 0, 1, 81, 96, 1, 96, 1, 96, 160, 27, 3, 22, 20, 21, 97, 24, 225, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 43, 139, 86, 91, 133, 129, 129, 81, 129, 16, 97, 24, 237, 87, 254, 91, 96, 32, 2, 96, 32, 1, 1, 81, 96, 32, 1, 81, 96, 0, 20, 21, 97, 25, 25, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 42, 171, 86, 91, 96, 0, 135, 129, 82, 96, 9, 96, 32, 82, 96, 64, 144, 32, 134, 81, 135, 144, 131, 144, 129, 16, 97, 25, 53, 87, 254, 91, 96, 32, 144, 129, 2, 145, 144, 145, 1, 129, 1, 81, 130, 84, 96, 1, 128, 130, 1, 133, 85, 96, 0, 148, 133, 82, 147, 131, 144, 32, 130, 81, 96, 2, 144, 146, 2, 1, 128, 84, 96, 1, 96, 1, 96, 160, 27, 3, 25, 22, 96, 1, 96, 1, 96, 160, 27, 3, 144, 146, 22, 145, 144, 145, 23, 129, 85, 145, 1, 81, 145, 1, 85, 133, 81, 134, 144, 130, 144, 129, 16, 97, 25, 140, 87, 254, 91, 96, 32, 2, 96, 32, 1, 1, 81, 96, 0, 1, 81, 131, 130, 129, 81, 129, 16, 97, 25, 164, 87, 254, 91, 96, 32, 2, 96, 32, 1, 1, 144, 96, 1, 96, 1, 96, 160, 27, 3, 22, 144, 129, 96, 1, 96, 1, 96, 160, 27, 3, 22, 129, 82, 80, 80, 133, 129, 129, 81, 129, 16, 97, 25, 208, 87, 254, 91, 96, 32, 2, 96, 32, 1, 1, 81, 96, 32, 1, 81, 130, 130, 129, 81, 129, 16, 97, 25, 232, 87, 254, 91, 96, 32, 144, 129, 2, 145, 144, 145, 1, 1, 82, 96, 1, 1, 97, 24, 142, 86, 91, 80, 132, 81, 21, 97, 26, 63, 87, 127, 153, 171, 161, 214, 55, 73, 207, 213, 173, 26, 253, 167, 196, 102, 56, 64, 146, 77, 84, 235, 95, 0, 91, 187, 234, 222, 220, 110, 193, 54, 116, 178, 134, 131, 131, 96, 64, 81, 97, 26, 54, 147, 146, 145, 144, 97, 43, 233, 86, 91, 96, 64, 81, 128, 145, 3, 144, 161, 91, 96, 0, 134, 129, 82, 96, 6, 96, 32, 144, 129, 82, 96, 64, 128, 131, 32, 51, 132, 82, 144, 145, 82, 144, 32, 132, 144, 85, 97, 26, 101, 134, 132, 97, 27, 50, 86, 91, 96, 64, 81, 51, 144, 96, 0, 144, 130, 144, 127, 195, 213, 129, 104, 197, 174, 115, 151, 115, 29, 6, 61, 91, 191, 61, 101, 120, 84, 66, 115, 67, 244, 192, 131, 36, 15, 122, 172, 170, 45, 15, 98, 144, 97, 26, 158, 144, 139, 144, 138, 144, 97, 44, 29, 86, 91, 96, 64, 81, 128, 145, 3, 144, 164, 133, 127, 107, 183, 255, 112, 134, 25, 186, 6, 16, 203, 162, 149, 165, 133, 146, 224, 69, 29, 238, 38, 34, 147, 140, 135, 85, 102, 118, 136, 218, 243, 82, 155, 132, 96, 64, 81, 97, 26, 214, 145, 144, 97, 42, 154, 86, 91, 96, 64, 81, 128, 145, 3, 144, 162, 80, 80, 80, 80, 80, 80, 86, 91, 97, 26, 240, 130, 130, 97, 19, 197, 86, 91, 21, 97, 27, 13, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 42, 187, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 22, 96, 0, 144, 129, 82, 96, 32, 145, 144, 145, 82, 96, 64, 144, 32, 128, 84, 96, 255, 25, 22, 96, 1, 23, 144, 85, 86, 91, 96, 0, 130, 129, 82, 96, 8, 96, 32, 82, 96, 64, 144, 32, 84, 96, 1, 96, 1, 96, 160, 27, 3, 22, 97, 27, 102, 87, 96, 64, 81, 98, 70, 27, 205, 96, 229, 27, 129, 82, 96, 4, 1, 97, 4, 230, 144, 97, 42, 219, 86, 91, 97, 20, 36, 130, 130, 96, 0, 130, 129, 82, 96, 4, 96, 32, 144, 129, 82, 96, 64, 144, 145, 32, 130, 81, 97, 27, 138, 146, 132, 1, 144, 97, 27, 143, 86, 91, 80, 80, 80, 86, 91, 130, 128, 84, 96, 1, 129, 96, 1, 22, 21, 97, 1, 0, 2, 3, 22, 96, 2, 144, 4, 144, 96, 0, 82, 96, 32, 96, 0, 32, 144, 96, 31, 1, 96, 32, 144, 4, 129, 1, 146, 130, 96, 31, 16, 97, 27, 208, 87, 128, 81, 96, 255, 25, 22, 131, 128, 1, 23, 133, 85, 97, 27, 253, 86, 91, 130, 128, 1, 96, 1, 1, 133, 85, 130, 21, 97, 27, 253, 87, 145, 130, 1, 91, 130, 129, 17, 21, 97, 27, 253, 87, 130, 81, 130, 85, 145, 96, 32, 1, 145, 144, 96, 1, 1, 144, 97, 27, 226, 86, 91, 80, 97, 28, 9, 146, 145, 80, 97, 28, 13, 86, 91, 80, 144, 86, 91, 97, 10, 154, 145, 144, 91, 128, 130, 17, 21, 97, 28, 9, 87, 96, 0, 129, 85, 96, 1, 1, 97, 28, 19, 86, 91, 128, 53, 97, 4, 15, 129, 97, 45, 66, 86, 91, 96, 0, 128, 131, 96, 31, 132, 1, 18, 97, 28, 68, 87, 96, 0, 128, 253, 91, 80, 129, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 28, 91, 87, 96, 0, 128, 253, 91, 96, 32, 131, 1, 145, 80, 131, 96, 32, 130, 2, 131, 1, 17, 21, 97, 28, 115, 87, 96, 0, 128, 253, 91, 146, 80, 146, 144, 80, 86, 91, 96, 0, 130, 96, 31, 131, 1, 18, 97, 28, 139, 87, 96, 0, 128, 253, 91, 129, 53, 97, 28, 158, 97, 28, 153, 130, 97, 44, 81, 86, 91, 97, 44, 43, 86, 91, 145, 80, 129, 129, 131, 82, 96, 32, 132, 1, 147, 80, 96, 32, 129, 1, 144, 80, 131, 133, 96, 64, 132, 2, 130, 1, 17, 21, 97, 28, 195, 87, 96, 0, 128, 253, 91, 96, 0, 91, 131, 129, 16, 21, 97, 28, 241, 87, 129, 97, 28, 217, 136, 130, 97, 29, 183, 86, 91, 132, 82, 80, 96, 32, 144, 146, 1, 145, 96, 64, 145, 144, 145, 1, 144, 96, 1, 1, 97, 28, 198, 86, 91, 80, 80, 80, 80, 146, 145, 80, 80, 86, 91, 128, 53, 97, 4, 15, 129, 97, 45, 86, 86, 91, 128, 53, 97, 4, 15, 129, 97, 45, 95, 86, 91, 128, 53, 97, 4, 15, 129, 97, 45, 104, 86, 91, 128, 81, 97, 4, 15, 129, 97, 45, 104, 86, 91, 96, 0, 128, 131, 96, 31, 132, 1, 18, 97, 29, 57, 87, 96, 0, 128, 253, 91, 80, 129, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 29, 80, 87, 96, 0, 128, 253, 91, 96, 32, 131, 1, 145, 80, 131, 96, 1, 130, 2, 131, 1, 17, 21, 97, 28, 115, 87, 96, 0, 128, 253, 91, 96, 0, 130, 96, 31, 131, 1, 18, 97, 29, 121, 87, 96, 0, 128, 253, 91, 129, 53, 97, 29, 135, 97, 28, 153, 130, 97, 44, 113, 86, 91, 145, 80, 128, 130, 82, 96, 32, 131, 1, 96, 32, 131, 1, 133, 131, 131, 1, 17, 21, 97, 29, 163, 87, 96, 0, 128, 253, 91, 97, 29, 174, 131, 130, 132, 97, 44, 229, 86, 91, 80, 80, 80, 146, 145, 80, 80, 86, 91, 96, 0, 96, 64, 130, 132, 3, 18, 21, 97, 29, 201, 87, 96, 0, 128, 253, 91, 97, 29, 211, 96, 64, 97, 44, 43, 86, 91, 144, 80, 96, 0, 97, 29, 225, 132, 132, 97, 28, 39, 86, 91, 130, 82, 80, 96, 32, 97, 29, 242, 132, 132, 131, 1, 97, 29, 6, 86, 91, 96, 32, 131, 1, 82, 80, 146, 145, 80, 80, 86, 91, 128, 53, 97, 4, 15, 129, 97, 45, 113, 86, 91, 96, 0, 96, 32, 130, 132, 3, 18, 21, 97, 30, 27, 87, 96, 0, 128, 253, 91, 96, 0, 97, 19, 14, 132, 132, 97, 28, 39, 86, 91, 96, 0, 128, 96, 64, 131, 133, 3, 18, 21, 97, 30, 58, 87, 96, 0, 128, 253, 91, 96, 0, 97, 30, 70, 133, 133, 97, 28, 39, 86, 91, 146, 80, 80, 96, 32, 97, 30, 87, 133, 130, 134, 1, 97, 28, 39, 86, 91, 145, 80, 80, 146, 80, 146, 144, 80, 86, 91, 96, 0, 128, 96, 0, 128, 96, 0, 128, 96, 0, 128, 96, 160, 137, 139, 3, 18, 21, 97, 30, 125, 87, 96, 0, 128, 253, 91, 96, 0, 97, 30, 137, 139, 139, 97, 28, 39, 86, 91, 152, 80, 80, 96, 32, 97, 30, 154, 139, 130, 140, 1, 97, 28, 39, 86, 91, 151, 80, 80, 96, 64, 137, 1, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 30, 182, 87, 96, 0, 128, 253, 91, 97, 30, 194, 139, 130, 140, 1, 97, 28, 50, 86, 91, 150, 80, 150, 80, 80, 96, 96, 137, 1, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 30, 224, 87, 96, 0, 128, 253, 91, 97, 30, 236, 139, 130, 140, 1, 97, 28, 50, 86, 91, 148, 80, 148, 80, 80, 96, 128, 137, 1, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 31, 10, 87, 96, 0, 128, 253, 91, 97, 31, 22, 139, 130, 140, 1, 97, 29, 39, 86, 91, 146, 80, 146, 80, 80, 146, 149, 152, 80, 146, 149, 152, 144, 147, 150, 80, 86, 91, 96, 0, 128, 96, 0, 128, 96, 0, 128, 96, 160, 135, 137, 3, 18, 21, 97, 31, 65, 87, 96, 0, 128, 253, 91, 96, 0, 97, 31, 77, 137, 137, 97, 28, 39, 86, 91, 150, 80, 80, 96, 32, 97, 31, 94, 137, 130, 138, 1, 97, 28, 39, 86, 91, 149, 80, 80, 96, 64, 97, 31, 111, 137, 130, 138, 1, 97, 29, 6, 86, 91, 148, 80, 80, 96, 96, 97, 31, 128, 137, 130, 138, 1, 97, 29, 6, 86, 91, 147, 80, 80, 96, 128, 135, 1, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 31, 156, 87, 96, 0, 128, 253, 91, 97, 31, 168, 137, 130, 138, 1, 97, 29, 39, 86, 91, 146, 80, 146, 80, 80, 146, 149, 80, 146, 149, 80, 146, 149, 86, 91, 96, 0, 128, 96, 64, 131, 133, 3, 18, 21, 97, 31, 202, 87, 96, 0, 128, 253, 91, 96, 0, 97, 31, 214, 133, 133, 97, 28, 39, 86, 91, 146, 80, 80, 96, 32, 97, 30, 87, 133, 130, 134, 1, 97, 28, 251, 86, 91, 96, 0, 128, 96, 64, 131, 133, 3, 18, 21, 97, 31, 250, 87, 96, 0, 128, 253, 91, 96, 0, 97, 32, 6, 133, 133, 97, 28, 39, 86, 91, 146, 80, 80, 96, 32, 97, 30, 87, 133, 130, 134, 1, 97, 29, 6, 86, 91, 96, 0, 128, 96, 0, 96, 96, 132, 134, 3, 18, 21, 97, 32, 44, 87, 96, 0, 128, 253, 91, 96, 0, 97, 32, 56, 134, 134, 97, 28, 39, 86, 91, 147, 80, 80, 96, 32, 97, 32, 73, 134, 130, 135, 1, 97, 29, 6, 86, 91, 146, 80, 80, 96, 64, 97, 32, 90, 134, 130, 135, 1, 97, 29, 6, 86, 91, 145, 80, 80, 146, 80, 146, 80, 146, 86, 91, 96, 0, 128, 96, 0, 128, 96, 64, 133, 135, 3, 18, 21, 97, 32, 122, 87, 96, 0, 128, 253, 91, 132, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 32, 144, 87, 96, 0, 128, 253, 91, 97, 32, 156, 135, 130, 136, 1, 97, 28, 50, 86, 91, 148, 80, 148, 80, 80, 96, 32, 133, 1, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 32, 186, 87, 96, 0, 128, 253, 91, 97, 32, 198, 135, 130, 136, 1, 97, 28, 50, 86, 91, 149, 152, 148, 151, 80, 149, 80, 80, 80, 80, 86, 91, 96, 0, 96, 32, 130, 132, 3, 18, 21, 97, 32, 228, 87, 96, 0, 128, 253, 91, 96, 0, 97, 19, 14, 132, 132, 97, 29, 17, 86, 91, 96, 0, 96, 32, 130, 132, 3, 18, 21, 97, 33, 2, 87, 96, 0, 128, 253, 91, 96, 0, 97, 19, 14, 132, 132, 97, 29, 28, 86, 91, 96, 0, 96, 32, 130, 132, 3, 18, 21, 97, 33, 32, 87, 96, 0, 128, 253, 91, 129, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 33, 54, 87, 96, 0, 128, 253, 91, 97, 19, 14, 132, 130, 133, 1, 97, 29, 104, 86, 91, 96, 0, 96, 32, 130, 132, 3, 18, 21, 97, 33, 84, 87, 96, 0, 128, 253, 91, 96, 0, 97, 19, 14, 132, 132, 97, 29, 6, 86, 91, 96, 0, 128, 96, 64, 131, 133, 3, 18, 21, 97, 33, 115, 87, 96, 0, 128, 253, 91, 96, 0, 97, 32, 6, 133, 133, 97, 29, 6, 86, 91, 96, 0, 128, 96, 0, 128, 96, 0, 128, 96, 0, 96, 224, 136, 138, 3, 18, 21, 97, 33, 154, 87, 96, 0, 128, 253, 91, 96, 0, 97, 33, 166, 138, 138, 97, 29, 6, 86, 91, 151, 80, 80, 96, 32, 97, 33, 183, 138, 130, 139, 1, 97, 29, 254, 86, 91, 150, 80, 80, 96, 64, 97, 33, 200, 138, 130, 139, 1, 97, 29, 6, 86, 91, 149, 80, 80, 96, 96, 97, 33, 217, 138, 130, 139, 1, 97, 29, 6, 86, 91, 148, 80, 80, 96, 128, 136, 1, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 33, 245, 87, 96, 0, 128, 253, 91, 97, 34, 1, 138, 130, 139, 1, 97, 28, 122, 86, 91, 147, 80, 80, 96, 160, 97, 34, 18, 138, 130, 139, 1, 97, 29, 6, 86, 91, 146, 80, 80, 96, 192, 136, 1, 53, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 21, 97, 34, 46, 87, 96, 0, 128, 253, 91, 97, 34, 58, 138, 130, 139, 1, 97, 29, 104, 86, 91, 145, 80, 80, 146, 149, 152, 145, 148, 151, 80, 146, 149, 80, 86, 91, 96, 0, 97, 34, 85, 131, 131, 97, 34, 105, 86, 91, 80, 80, 96, 32, 1, 144, 86, 91, 96, 0, 97, 34, 85, 131, 131, 97, 35, 175, 86, 91, 97, 34, 114, 129, 97, 44, 171, 86, 91, 130, 82, 80, 80, 86, 91, 96, 0, 97, 34, 131, 130, 97, 44, 158, 86, 91, 97, 34, 141, 129, 133, 97, 44, 162, 86, 91, 147, 80, 97, 34, 152, 131, 97, 44, 152, 86, 91, 128, 96, 0, 91, 131, 129, 16, 21, 97, 34, 198, 87, 129, 81, 97, 34, 176, 136, 130, 97, 34, 73, 86, 91, 151, 80, 97, 34, 187, 131, 97, 44, 152, 86, 91, 146, 80, 80, 96, 1, 1, 97, 34, 156, 86, 91, 80, 148, 149, 148, 80, 80, 80, 80, 80, 86, 91, 96, 0, 97, 34, 220, 130, 97, 44, 158, 86, 91, 97, 34, 230, 129, 133, 97, 44, 162, 86, 91, 147, 80, 97, 34, 241, 131, 97, 44, 152, 86, 91, 128, 96, 0, 91, 131, 129, 16, 21, 97, 34, 198, 87, 129, 81, 97, 35, 9, 136, 130, 97, 34, 73, 86, 91, 151, 80, 97, 35, 20, 131, 97, 44, 152, 86, 91, 146, 80, 80, 96, 1, 1, 97, 34, 245, 86, 91, 96, 0, 97, 35, 43, 131, 133, 97, 44, 162, 86, 91, 147, 80, 96, 1, 96, 1, 96, 251, 27, 3, 131, 17, 21, 97, 35, 65, 87, 96, 0, 128, 253, 91, 96, 32, 131, 2, 146, 80, 97, 35, 82, 131, 133, 132, 97, 44, 229, 86, 91, 80, 80, 1, 144, 86, 91, 96, 0, 97, 35, 99, 130, 97, 44, 158, 86, 91, 97, 35, 109, 129, 133, 97, 44, 162, 86, 91, 147, 80, 97, 35, 120, 131, 97, 44, 152, 86, 91, 128, 96, 0, 91, 131, 129, 16, 21, 97, 34, 198, 87, 129, 81, 97, 35, 144, 136, 130, 97, 34, 93, 86, 91, 151, 80, 97, 35, 155, 131, 97, 44, 152, 86, 91, 146, 80, 80, 96, 1, 1, 97, 35, 124, 86, 91, 97, 34, 114, 129, 97, 44, 182, 86, 91, 97, 34, 114, 129, 97, 10, 154, 86, 91, 96, 0, 97, 35, 195, 130, 97, 44, 158, 86, 91, 97, 35, 205, 129, 133, 97, 44, 162, 86, 91, 147, 80, 97, 35, 221, 129, 133, 96, 32, 134, 1, 97, 44, 241, 86, 91, 97, 35, 230, 129, 97, 45, 50, 86, 91, 144, 147, 1, 147, 146, 80, 80, 80, 86, 91, 97, 34, 114, 97, 35, 252, 130, 97, 44, 218, 86, 91, 97, 45, 33, 86, 91, 96, 0, 97, 36, 14, 96, 28, 131, 97, 44, 162, 86, 91, 127, 70, 101, 101, 32, 118, 97, 108, 117, 101, 32, 115, 104, 111, 117, 108, 100, 32, 98, 101, 32, 112, 111, 115, 105, 116, 105, 118, 101, 0, 0, 0, 0, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 36, 71, 96, 31, 131, 97, 44, 162, 86, 91, 127, 82, 111, 108, 101, 115, 58, 32, 97, 99, 99, 111, 117, 110, 116, 32, 97, 108, 114, 101, 97, 100, 121, 32, 104, 97, 115, 32, 114, 111, 108, 101, 0, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 36, 128, 96, 38, 131, 97, 44, 162, 86, 91, 127, 79, 119, 110, 97, 98, 108, 101, 58, 32, 110, 101, 119, 32, 111, 119, 110, 101, 114, 32, 105, 115, 32, 116, 104, 101, 32, 122, 101, 114, 111, 32, 97, 129, 82, 101, 100, 100, 114, 101, 115, 115, 96, 208, 27, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 36, 200, 96, 32, 131, 97, 44, 162, 86, 91, 127, 95, 115, 101, 116, 84, 111, 107, 101, 110, 85, 82, 73, 58, 32, 84, 111, 107, 101, 110, 32, 115, 104, 111, 117, 108, 100, 32, 101, 120, 105, 115, 116, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 37, 1, 96, 37, 131, 97, 44, 162, 86, 91, 127, 100, 101, 115, 116, 105, 110, 97, 116, 105, 111, 110, 32, 97, 100, 100, 114, 101, 115, 115, 32, 109, 117, 115, 116, 32, 98, 101, 32, 110, 111, 110, 45, 129, 82, 100, 61, 50, 185, 55, 151, 96, 217, 27, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 37, 72, 96, 33, 131, 97, 44, 162, 86, 91, 127, 82, 111, 108, 101, 115, 58, 32, 97, 99, 99, 111, 117, 110, 116, 32, 100, 111, 101, 115, 32, 110, 111, 116, 32, 104, 97, 118, 101, 32, 114, 111, 108, 129, 82, 96, 101, 96, 248, 27, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 37, 139, 96, 43, 131, 97, 44, 162, 86, 91, 127, 78, 101, 101, 100, 32, 111, 112, 101, 114, 97, 116, 111, 114, 32, 97, 112, 112, 114, 111, 118, 97, 108, 32, 102, 111, 114, 32, 51, 114, 100, 32, 112, 129, 82, 106, 48, 185, 58, 60, 144, 49, 58, 185, 55, 57, 151, 96, 169, 27, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 37, 216, 96, 47, 131, 97, 44, 162, 86, 91, 127, 78, 101, 101, 100, 32, 111, 112, 101, 114, 97, 116, 111, 114, 32, 97, 112, 112, 114, 111, 118, 97, 108, 32, 102, 111, 114, 32, 51, 114, 100, 32, 112, 129, 82, 110, 48, 185, 58, 60, 144, 58, 57, 48, 183, 57, 179, 50, 185, 57, 151, 96, 137, 27, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 38, 41, 96, 62, 131, 97, 44, 162, 86, 91, 127, 99, 111, 110, 116, 114, 97, 99, 116, 32, 114, 101, 116, 117, 114, 110, 101, 100, 32, 97, 110, 32, 117, 110, 107, 110, 111, 119, 110, 32, 118, 97, 108, 129, 82, 127, 117, 101, 32, 102, 114, 111, 109, 32, 111, 110, 69, 82, 67, 49, 49, 53, 53, 66, 97, 116, 99, 104, 82, 101, 99, 101, 105, 118, 101, 100, 0, 0, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 38, 136, 96, 32, 131, 97, 44, 162, 86, 91, 127, 79, 119, 110, 97, 98, 108, 101, 58, 32, 99, 97, 108, 108, 101, 114, 32, 105, 115, 32, 110, 111, 116, 32, 116, 104, 101, 32, 111, 119, 110, 101, 114, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 38, 193, 96, 34, 131, 97, 44, 162, 86, 91, 127, 82, 111, 108, 101, 115, 58, 32, 97, 99, 99, 111, 117, 110, 116, 32, 105, 115, 32, 116, 104, 101, 32, 122, 101, 114, 111, 32, 97, 100, 100, 114, 101, 129, 82, 97, 115, 115, 96, 240, 27, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 39, 5, 96, 23, 131, 97, 44, 162, 86, 91, 127, 84, 111, 107, 101, 110, 32, 105, 115, 32, 97, 108, 114, 101, 97, 100, 121, 32, 109, 105, 110, 116, 101, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 39, 62, 96, 25, 131, 97, 44, 162, 86, 91, 127, 83, 117, 112, 112, 108, 121, 32, 115, 104, 111, 117, 108, 100, 32, 98, 101, 32, 112, 111, 115, 105, 116, 105, 118, 101, 0, 0, 0, 0, 0, 0, 0, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 39, 119, 96, 41, 131, 97, 44, 162, 86, 91, 127, 95, 105, 100, 115, 32, 97, 110, 100, 32, 95, 118, 97, 108, 117, 101, 115, 32, 97, 114, 114, 97, 121, 32, 108, 101, 110, 103, 104, 116, 32, 109, 117, 129, 82, 104, 57, 186, 16, 54, 176, 186, 49, 180, 23, 96, 185, 27, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 39, 194, 96, 27, 131, 97, 44, 162, 86, 91, 127, 82, 101, 99, 105, 112, 105, 101, 110, 116, 32, 115, 104, 111, 117, 108, 100, 32, 98, 101, 32, 112, 114, 101, 115, 101, 110, 116, 0, 0, 0, 0, 0, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 39, 251, 96, 57, 131, 97, 44, 162, 86, 91, 127, 99, 111, 110, 116, 114, 97, 99, 116, 32, 114, 101, 116, 117, 114, 110, 101, 100, 32, 97, 110, 32, 117, 110, 107, 110, 111, 119, 110, 32, 118, 97, 108, 129, 82, 127, 117, 101, 32, 102, 114, 111, 109, 32, 111, 110, 69, 82, 67, 49, 49, 53, 53, 82, 101, 99, 101, 105, 118, 101, 100, 0, 0, 0, 0, 0, 0, 0, 96, 32, 130, 1, 82, 96, 64, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 40, 90, 96, 21, 131, 97, 44, 162, 86, 91, 116, 47, 186, 55, 144, 54, 186, 185, 186, 16, 49, 50, 144, 55, 55, 183, 22, 189, 50, 185, 55, 151, 96, 89, 27, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 40, 139, 96, 26, 131, 97, 44, 162, 86, 91, 127, 115, 105, 103, 110, 101, 114, 32, 115, 104, 111, 117, 108, 100, 32, 115, 105, 103, 110, 32, 116, 111, 107, 101, 110, 73, 100, 0, 0, 0, 0, 0, 0, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 0, 97, 40, 196, 96, 17, 131, 97, 44, 162, 86, 91, 112, 29, 92, 154, 72, 28, 218, 27, 221, 91, 25, 8, 24, 153, 72, 28, 217, 93, 96, 122, 27, 129, 82, 96, 32, 1, 146, 145, 80, 80, 86, 91, 97, 34, 114, 97, 40, 240, 130, 97, 10, 154, 86, 91, 97, 10, 154, 86, 91, 97, 34, 114, 129, 97, 44, 212, 86, 91, 96, 0, 97, 41, 10, 130, 133, 97, 35, 240, 86, 91, 96, 20, 130, 1, 145, 80, 97, 41, 26, 130, 132, 97, 40, 228, 86, 91, 80, 96, 32, 1, 146, 145, 80, 80, 86, 91, 96, 32, 129, 1, 97, 4, 15, 130, 132, 97, 34, 105, 86, 91, 96, 64, 129, 1, 97, 41, 64, 130, 133, 97, 34, 105, 86, 91, 97, 41, 77, 96, 32, 131, 1, 132, 97, 35, 175, 86, 91, 147, 146, 80, 80, 80, 86, 91, 96, 160, 129, 1, 97, 41, 98, 130, 136, 97, 34, 105, 86, 91, 97, 41, 111, 96, 32, 131, 1, 135, 97, 34, 105, 86, 91, 129, 129, 3, 96, 64, 131, 1, 82, 97, 41, 129, 129, 134, 97, 35, 88, 86, 91, 144, 80, 129, 129, 3, 96, 96, 131, 1, 82, 97, 41, 149, 129, 133, 97, 35, 88, 86, 91, 144, 80, 129, 129, 3, 96, 128, 131, 1, 82, 97, 41, 169, 129, 132, 97, 35, 184, 86, 91, 151, 150, 80, 80, 80, 80, 80, 80, 80, 86, 91, 96, 160, 129, 1, 97, 41, 194, 130, 136, 97, 34, 105, 86, 91, 97, 41, 207, 96, 32, 131, 1, 135, 97, 34, 105, 86, 91, 97, 41, 220, 96, 64, 131, 1, 134, 97, 35, 175, 86, 91, 97, 41, 233, 96, 96, 131, 1, 133, 97, 35, 175, 86, 91, 129, 129, 3, 96, 128, 131, 1, 82, 97, 41, 169, 129, 132, 97, 35, 184, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 41, 77, 129, 132, 97, 34, 209, 86, 91, 96, 64, 128, 130, 82, 129, 1, 97, 42, 30, 129, 134, 136, 97, 35, 31, 86, 91, 144, 80, 129, 129, 3, 96, 32, 131, 1, 82, 97, 42, 51, 129, 132, 134, 97, 35, 31, 86, 91, 150, 149, 80, 80, 80, 80, 80, 80, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 41, 77, 129, 132, 97, 35, 88, 86, 91, 96, 32, 129, 1, 97, 4, 15, 130, 132, 97, 35, 166, 86, 91, 96, 128, 129, 1, 97, 42, 106, 130, 135, 97, 35, 175, 86, 91, 97, 42, 119, 96, 32, 131, 1, 134, 97, 40, 245, 86, 91, 97, 42, 132, 96, 64, 131, 1, 133, 97, 35, 175, 86, 91, 97, 42, 145, 96, 96, 131, 1, 132, 97, 35, 175, 86, 91, 149, 148, 80, 80, 80, 80, 80, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 41, 77, 129, 132, 97, 35, 184, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 36, 1, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 36, 58, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 36, 115, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 36, 187, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 36, 244, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 37, 59, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 37, 126, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 37, 203, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 38, 28, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 38, 123, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 38, 180, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 38, 248, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 39, 49, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 39, 106, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 39, 181, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 39, 238, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 40, 77, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 40, 126, 86, 91, 96, 32, 128, 130, 82, 129, 1, 97, 4, 15, 129, 97, 40, 183, 86, 91, 96, 32, 129, 1, 97, 4, 15, 130, 132, 97, 35, 175, 86, 91, 96, 96, 129, 1, 97, 43, 247, 130, 134, 97, 35, 175, 86, 91, 129, 129, 3, 96, 32, 131, 1, 82, 97, 44, 9, 129, 133, 97, 34, 120, 86, 91, 144, 80, 129, 129, 3, 96, 64, 131, 1, 82, 97, 42, 145, 129, 132, 97, 35, 88, 86, 91, 96, 64, 129, 1, 97, 41, 64, 130, 133, 97, 35, 175, 86, 91, 96, 64, 81, 129, 129, 1, 96, 1, 96, 1, 96, 64, 27, 3, 129, 17, 130, 130, 16, 23, 21, 97, 44, 73, 87, 96, 0, 128, 253, 91, 96, 64, 82, 145, 144, 80, 86, 91, 96, 0, 96, 1, 96, 1, 96, 64, 27, 3, 130, 17, 21, 97, 44, 103, 87, 96, 0, 128, 253, 91, 80, 96, 32, 144, 129, 2, 1, 144, 86, 91, 96, 0, 96, 1, 96, 1, 96, 64, 27, 3, 130, 17, 21, 97, 44, 135, 87, 96, 0, 128, 253, 91, 80, 96, 32, 96, 31, 145, 144, 145, 1, 96, 31, 25, 22, 1, 144, 86, 91, 96, 32, 1, 144, 86, 91, 81, 144, 86, 91, 144, 129, 82, 96, 32, 1, 144, 86, 91, 96, 0, 97, 4, 15, 130, 97, 44, 200, 86, 91, 21, 21, 144, 86, 91, 96, 1, 96, 1, 96, 224, 27, 3, 25, 22, 144, 86, 91, 96, 1, 96, 1, 96, 160, 27, 3, 22, 144, 86, 91, 96, 255, 22, 144, 86, 91, 96, 0, 97, 4, 15, 130, 97, 44, 171, 86, 91, 130, 129, 131, 55, 80, 96, 0, 145, 1, 82, 86, 91, 96, 0, 91, 131, 129, 16, 21, 97, 45, 12, 87, 129, 129, 1, 81, 131, 130, 1, 82, 96, 32, 1, 97, 44, 244, 86, 91, 131, 129, 17, 21, 97, 45, 27, 87, 96, 0, 132, 132, 1, 82, 91, 80, 80, 80, 80, 86, 91, 96, 0, 97, 4, 15, 130, 96, 0, 97, 4, 15, 130, 97, 45, 60, 86, 91, 96, 31, 1, 96, 31, 25, 22, 144, 86, 91, 96, 96, 27, 144, 86, 91, 97, 45, 75, 129, 97, 44, 171, 86, 91, 129, 20, 97, 4, 248, 87, 96, 0, 128, 253, 91, 97, 45, 75, 129, 97, 44, 182, 86, 91, 97, 45, 75, 129, 97, 10, 154, 86, 91, 97, 45, 75, 129, 97, 44, 187, 86, 91, 97, 45, 75, 129, 97, 44, 212, 86, 254, 163, 101, 98, 122, 122, 114, 49, 88, 32, 112, 99, 189, 218, 52, 161, 239, 153, 96, 81, 62, 78, 84, 154, 131, 156, 21, 193, 23, 214, 39, 16, 168, 42, 61, 224, 61, 137, 189, 46, 22, 202, 108, 101, 120, 112, 101, 114, 105, 109, 101, 110, 116, 97, 108, 245, 100, 115, 111, 108, 99, 67, 0, 5, 17, 0, 64}) ) diff --git a/eth/tracers/blocknative/decoder/types.go b/eth/tracers/blocknative/decoder/types.go new file mode 100644 index 000000000000..7ad0d0a3a531 --- /dev/null +++ b/eth/tracers/blocknative/decoder/types.go @@ -0,0 +1,149 @@ +package decoder + +import ( + "encoding/json" + "fmt" + "github.com/ethereum/go-ethereum/common" + "math/big" +) + +type CallFrame struct { + *Contract + *CallData +} + +type Contract struct { + Type ContractType `json:"type,omitempty"` + interfaces []Interface +} + +type CallData struct { + MethodID MethodID `json:"methodID"` + Args []string `json:"args,omitempty"` + Transfers []*Transfer `json:"-"` +} + +type Transfer struct { + Asset *Asset `json:"asset,omitempty"` + From common.Address `json:"from"` + To common.Address `json:"to"` + Value *Amount `json:"value"` + TokenID *big.Int `json:"tokenID,omitempty"` +} + +type Asset struct { + AssetID + *AssetMetadata +} + +type AssetID struct { + Address common.Address `json:"address"` + TokenID *big.Int `json:"tokenID,omitempty"` +} + +type AssetMetadata struct { + Type AssetType `json:"type,omitempty"` + Name string `json:"name,omitempty"` + Symbol string `json:"symbol,omitempty"` + Decimals uint8 `json:"decimals,omitempty"` + URI string `json:"uri,omitempty"` +} + +type ContractType uint8 + +func (ct ContractType) String() string { + return contractTypes[ct] +} + +func (ct ContractType) MarshalJSON() ([]byte, error) { + return json.Marshal(ct.String()) +} + +func (ct *ContractType) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return err + } + *ct = contractTypesByName[s] + return nil +} + +const ( + ContractTypeUnknown ContractType = iota + ContractTypeERC20 + ContractTypeERC721 + ContractTypeERC1155 + ContractTypeOPStack +) + +var ( + contractTypes = map[ContractType]string{ + ContractTypeUnknown: "", + ContractTypeERC20: "erc20", + ContractTypeERC721: "erc721", + ContractTypeERC1155: "erc1155", + ContractTypeOPStack: "op_stack", + } + contractTypesByName = reverseMap(contractTypes) +) + +func reverseMap[K comparable, V comparable](in map[K]V) map[V]K { + out := make(map[V]K, len(in)) + for k, v := range in { + out[v] = k + } + return out +} + +type Amount big.Int + +func NewAmount(i *big.Int) *Amount { + return (*Amount)(i) +} + +func (a *Amount) SetBytes(b []byte) { + *a = *(*Amount)(big.NewInt(0).SetBytes(b)) +} + +func (a *Amount) Add(x *Amount, y *Amount) { + a.ToInt().Add(x.ToInt(), y.ToInt()) +} + +func (a *Amount) AddInt(x *Amount, y *big.Int) { + a.ToInt().Add(x.ToInt(), y) +} + +func (a *Amount) Neg() *Amount { + neg := new(big.Int).Neg(a.ToInt()) + return NewAmount(neg) +} + +func (a *Amount) ToInt() *big.Int { + return (*big.Int)(a) +} + +func (a *Amount) String() string { + return a.ToInt().String() +} + +func (a *Amount) MarshalJSON() ([]byte, error) { + return json.Marshal(a.ToInt().String()) +} + +func (a *Amount) UnmarshalJSON(data []byte) error { + if data == nil || len(data) == 0 { + *a = *NewAmount(big.NewInt(0)) + return nil + } + + var s string + if err := json.Unmarshal(data, &s); err != nil { + return err + } + aInt, ok := new(big.Int).SetString(s, 10) + if !ok { + return fmt.Errorf("failed to convert string to Amount") + } + *a = *(*Amount)(aInt) + return nil +} diff --git a/eth/tracers/blocknative/txnOpCodeTracer.go b/eth/tracers/blocknative/txnOpCodeTracer.go index 5901015f9f79..7c89c050d980 100644 --- a/eth/tracers/blocknative/txnOpCodeTracer.go +++ b/eth/tracers/blocknative/txnOpCodeTracer.go @@ -3,6 +3,7 @@ package blocknative import ( "encoding/json" "fmt" + "math" "math/big" "sync/atomic" "time" @@ -14,23 +15,24 @@ import ( "github.com/ethereum/go-ethereum/log" ) -var metadataReader = decoder.NewAssetDecoder() +var ( + decoderCache = decoder.NewCaches() +) // txnOpCodeTracer is a go implementation of the Tracer interface which // only returns a restricted trace of a transaction consisting of transaction // op codes and relevant gas data. // This is intended for Blocknative usage. type txnOpCodeTracer struct { - env *vm.EVM // EVM context for execution of transaction to occur within - trace Trace // Accumulated execution data the caller is interested in - callStack []CallFrame // Data structure for op codes making up our trace - interrupt uint32 // Atomic flag to signal execution interruption - reason error // Textual reason for the interruption (not always specific for us) - opts TracerOpts - startTime time.Time + opts TracerOpts + env *vm.EVM + decoder *decoder.Decoder - balanceTracker *balanceTracker - metadataDecoder *decoder.AssetDecoder + trace Trace + startTime time.Time + callStack []CallFrame + interrupt uint32 + reason error } // NewTxnOpCodeTracer returns a new txnOpCodeTracer tracer with the given @@ -38,7 +40,6 @@ type txnOpCodeTracer struct { func NewTxnOpCodeTracer(cfg json.RawMessage) (Tracer, error) { var opts TracerOpts - // Decode raw json opts into our struct. if cfg != nil { if err := json.Unmarshal(cfg, &opts); err != nil { return nil, err @@ -49,11 +50,11 @@ func NewTxnOpCodeTracer(cfg json.RawMessage) (Tracer, error) { } func NewTxnOpCodeTracerWithOpts(opts TracerOpts) (Tracer, error) { - // First callframe contains tx context info and is populated on start and end. + opts.Decode = opts.Decode || opts.BalanceChanges + var t = txnOpCodeTracer{ - opts: opts, - callStack: make([]CallFrame, 1), - metadataDecoder: metadataReader, + opts: opts, + callStack: make([]CallFrame, 1), } if !t.opts.DisableBlockContext { @@ -66,12 +67,10 @@ func NewTxnOpCodeTracerWithOpts(opts TracerOpts) (Tracer, error) { // GetTrace returns the resulting Trace object. func (t *txnOpCodeTracer) GetTrace() (*Trace, error) { - // Get the final balance changes - if t.opts.BalanceChanges { - t.trace.BalanceChanges = t.balanceTracker.formatNetBalanceChanges() + if t.opts.Decode { + t.trace.BalanceChanges = t.decoder.GetBalanceChanges() } - // Only want the top level trace, all other indexes hold sub-traces to which we do not particularly need t.trace.CallFrame = t.callStack[0] return &t.trace, nil } @@ -95,14 +94,17 @@ func (t *txnOpCodeTracer) CaptureStart(env *vm.EVM, from common.Address, to comm t.startTime = time.Now() t.env = env - // Blocks only contain `Random` post-merge, but we still have pre-merge tests. - random := "" - if env.Context.Random != nil { - random = bytesToHex(env.Context.Random.Bytes()) + if t.opts.Decode { + t.decoder = decoder.New(decoderCache, decoderEVM{env}) } - // Populate the block context from the vm environment. if !t.opts.DisableBlockContext { + // Blocks only contain `Random` post-merge, but we still have pre-merge tests. + random := "" + if env.Context.Random != nil { + random = bytesToHex(env.Context.Random.Bytes()) + } + t.trace.BlockContext.Number = env.Context.BlockNumber.Uint64() t.trace.BlockContext.BaseFee = env.Context.BaseFee.Uint64() t.trace.BlockContext.Time = env.Context.Time @@ -111,7 +113,7 @@ func (t *txnOpCodeTracer) CaptureStart(env *vm.EVM, from common.Address, to comm t.trace.BlockContext.Random = random } - // This is the initial call + // Create a call-frame for the top level call. t.callStack[0] = CallFrame{ Type: "CALL", From: addrToHex(from), @@ -121,31 +123,20 @@ func (t *txnOpCodeTracer) CaptureStart(env *vm.EVM, from common.Address, to comm Value: bigToHex(value), } if create { - // TODO: Here we can note creation of contracts for potential future tracing t.callStack[0].Type = "CREATE" } - // If we want balance changes then create a tracker and handle the - // top-level call. - if t.opts.BalanceChanges { - assetGetterFn := func(assetID decoder.AssetID) (*decoder.Asset, error) { - return t.metadataDecoder.Decode(t.env, assetID) + // Try adding decode information but don't fail if we can't. + if t.opts.Decode { + if decoded, err := t.decoder.DecodeCallFrame(from, to, value, input); err == nil { + t.callStack[0].Decoded = decoded } - - t.balanceTracker = newBalanceChangeTracker(t.env.StateDB, assetGetterFn) - t.balanceTracker.captureCall(from, to, value, input) } } // CaptureEnd is called after the call finishes to finalize the tracing. func (t *txnOpCodeTracer) CaptureEnd(output []byte, gasUsed uint64, err error) { - elapsedTime := time.Now().Sub(t.startTime) - - // Collect final gasUsed - t.callStack[0].GasUsed = uintToHex(gasUsed) - - // Add total time duration for this trace request - t.trace.Time = fmt.Sprintf("%v", elapsedTime) + finalizeCallFrame(&t.callStack[0], output, gasUsed, err) // If the user wants the logs, grab them from the state if t.opts.Logs { @@ -158,28 +149,14 @@ func (t *txnOpCodeTracer) CaptureEnd(output []byte, gasUsed uint64, err error) { } } - // This is the final output of a call - if err != nil { - t.callStack[0].Error = err.Error() - if err.Error() == "execution reverted" && len(output) > 0 { - t.callStack[0].Output = bytesToHex(output) - - // This revert reason is found via the standard introduced in v0.8.4 - // It uses a ABI with the method Error(string) - // This is the top level call, internal txs may fail while top level succeeds still - revertReason, _ := abi.UnpackRevert(output) - t.callStack[0].ErrorReason = revertReason - } - } else { - // TODO: This output is for the originally called contract, we can use the ABI to decode this for useful information - // ie: there are custom error types in ABIs since 0.8.4 which will turn up here - t.callStack[0].Output = bytesToHex(output) - } - // Add gas payments to balance changes - if t.opts.BalanceChanges { - t.balanceTracker.captureGas(t.env.TxContext.Origin, t.env.Context.Coinbase, gasUsed, t.env.TxContext.GasPrice, t.env.Context.BaseFee) + if t.opts.Decode { + t.decoder.CaptureGas(t.env.TxContext.Origin, t.env.Context.Coinbase, gasUsed, t.env.TxContext.GasPrice, t.env.Context.BaseFee) } + + // Add total time duration for this trace request + elapsedTime := time.Now().Sub(t.startTime) + t.trace.Time = fmt.Sprintf("%v", elapsedTime) } // CaptureState implements the EVMLogger interface to trace a single step of VM execution. @@ -204,7 +181,7 @@ func (t *txnOpCodeTracer) CaptureEnter(typ vm.OpCode, from common.Address, to co return } - // Apart from the starting call detected by CaptureStart, here we track every new transaction opcode + // Create CallFrame, decode it, and all it to the end of the callstack. call := CallFrame{ Type: typ.String(), From: addrToHex(from), @@ -213,41 +190,35 @@ func (t *txnOpCodeTracer) CaptureEnter(typ vm.OpCode, from common.Address, to co Gas: uintToHex(gas), Value: bigToHex(value), } - t.callStack = append(t.callStack, call) - - // If we want to create NBC from decoded transactions, do so here - if t.opts.BalanceChanges { - t.balanceTracker.captureCall(from, to, value, input) + if t.opts.Decode { + if decoded, err := t.decoder.DecodeCallFrame(from, to, value, input); err == nil { + call.Decoded = decoded + } } + + t.callStack = append(t.callStack, call) } // CaptureExit is called when EVM exits a scope, even if the scope didn't execute any code. func (t *txnOpCodeTracer) CaptureExit(output []byte, gasUsed uint64, err error) { + // Skip if we have no call frames. size := len(t.callStack) - if size <= 1 { + if size == 0 { return } - // pop call - call := t.callStack[size-1] - t.callStack = t.callStack[:size-1] - size -= 1 - call.GasUsed = uintToHex(gasUsed) - if err == nil { - call.Output = bytesToHex(output) - } else { - call.Error = err.Error() - if err.Error() == "execution reverted" && len(output) > 0 { - call.Output = bytesToHex(output) - revertReason, _ := abi.UnpackRevert(output) - call.ErrorReason = revertReason - } + // We have a call frame, so finalize it. + finalizeCallFrame(&t.callStack[size-1], output, gasUsed, err) - if call.Type == "CREATE" || call.Type == "CREATE2" { - call.To = "" - } + // If we have a parent call frame nest this one into it. + if size <= 1 { + return } - t.callStack[size-1].Calls = append(t.callStack[size-1].Calls, call) + end := size - 1 + call := t.callStack[end] + t.callStack = t.callStack[:end] + end -= 1 + t.callStack[end].Calls = append(t.callStack[end].Calls, call) } // CaptureTxStart fulfils the standard Tracer interface, but we don't use it. @@ -268,3 +239,44 @@ func (t *txnOpCodeTracer) SetStateRoot(root common.Hash) { t.trace.BlockContext.StateRoot = bytesToHex(root.Bytes()) } } + +func finalizeCallFrame(call *CallFrame, output []byte, gasUsed uint64, err error) { + call.GasUsed = uintToHex(gasUsed) + + // If there was an error then try decoding it and stop. + if err != nil { + call.Error = err.Error() + if err.Error() == "execution reverted" && len(output) > 0 { + call.Output = bytesToHex(output) + revertReason, _ := abi.UnpackRevert(output) + call.ErrorReason = revertReason + } + + if call.Type == "CREATE" || call.Type == "CREATE2" { + call.To = "" + } + return + } + + // The call was successful so decode the output. + call.Output = bytesToHex(output) +} + +type decoderEVM struct { + *vm.EVM +} + +func (d decoderEVM) GetCode(addr common.Address) []byte { + return d.StateDB.GetCode(addr) +} + +func (d decoderEVM) CallCode(addr common.Address, method []byte) ([]byte, error) { + code := d.StateDB.GetCode(addr) + contract := vm.NewContract(vm.AccountRef(common.Address{}), vm.AccountRef(addr), common.Big0, math.MaxUint64) + contract.SetCallCode(&addr, d.StateDB.GetCodeHash(addr), code) + ret, err := d.Interpreter().Run(contract, method, false) + if err != nil { + return nil, err + } + return ret, nil +} diff --git a/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/delegatecall.json b/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/delegatecall.json index f7327d3ff575..ec87a8c2b9cb 100644 --- a/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/delegatecall.json +++ b/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/delegatecall.json @@ -132,7 +132,7 @@ "tracerConfig": { "balanceChanges": true }, - "result":{ + "result": { "type": "CALL", "from": "0x3de712784baf97260455ae25fb74f574ec9c1add", "to": "0x6ca7f214ab2ddbb9a8e1a1e2c8550e3164e9dba5", @@ -150,7 +150,14 @@ "gas": "0x77e82", "gasUsed": "0x54c", "input": "0x8c172fa2d9a4ffe21d19763887176173d08241e8393c1dfd208f29193dfecdf854b664ac", - "output": "0x446374989d279847d0dbc6708a9c76a419fe9831d42c78bc89473f559a00d91500000000000000000000000061d76c05cd2aa9ed5135e21e52fff188b02089d4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000092f1dbea03ce08225e31e95cc926ddbe0198e6f2000000000000000000000000529c4cb814029b8bb32acb516ea3a4b07fdae350846fd373887ade3ab7703750294876afa61cf56303f5f014a4d80d04f508a1f100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + "output": "0x446374989d279847d0dbc6708a9c76a419fe9831d42c78bc89473f559a00d91500000000000000000000000061d76c05cd2aa9ed5135e21e52fff188b02089d4000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000092f1dbea03ce08225e31e95cc926ddbe0198e6f2000000000000000000000000529c4cb814029b8bb32acb516ea3a4b07fdae350846fd373887ade3ab7703750294876afa61cf56303f5f014a4d80d04f508a1f100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "decoded": { + "type": "erc20", + "methodID": "0x8c172fa2", + "args": [ + "0xd9a4ffe21d19763887176173d08241e8393c1dfd208f29193dfecdf854b664ac" + ] + } }, { "type": "CALL", @@ -170,7 +177,13 @@ "gas": "0x770ef", "gasUsed": "0xc24", "input": "0x24d4e90a0000000000000000000000000000000000000000000000020000000000000000", - "output": "0x000000000000000000000000000000000000000000000000b17217f7d1cf79ab" + "output": "0x000000000000000000000000000000000000000000000000b17217f7d1cf79ab", + "decoded": { + "methodID": "0x24d4e90a", + "args": [ + "0x0000000000000000000000000000000000000000000000020000000000000000" + ] + } }, { "type": "DELEGATECALL", @@ -180,7 +193,13 @@ "gas": "0x75eb2", "gasUsed": "0x265", "input": "0x872fb2b5000000000000000000000000000000000000000000000000c330b3f7006420b8", - "output": "0x00000000000000000000000000000000000000000000000224bf7df2c80f0878" + "output": "0x00000000000000000000000000000000000000000000000224bf7df2c80f0878", + "decoded": { + "methodID": "0x872fb2b5", + "args": [ + "0x000000000000000000000000000000000000000000000000c330b3f7006420b8" + ] + } }, { "type": "DELEGATECALL", @@ -190,7 +209,13 @@ "gas": "0x75aad", "gasUsed": "0x25b", "input": "0x872fb2b50000000000000000000000000000000000000000000000000000000000000000", - "output": "0x00000000000000000000000000000000000000000000000100000016aee6e8ef" + "output": "0x00000000000000000000000000000000000000000000000100000016aee6e8ef", + "decoded": { + "methodID": "0x872fb2b5", + "args": [ + "0x0000000000000000000000000000000000000000000000000000000000000000" + ] + } }, { "type": "DELEGATECALL", @@ -200,7 +225,13 @@ "gas": "0x75737", "gasUsed": "0xc24", "input": "0x24d4e90a00000000000000000000000000000000000000000000000324bf7e0976f5f167", - "output": "0x0000000000000000000000000000000000000000000000012535c5e5f87ee0d2" + "output": "0x0000000000000000000000000000000000000000000000012535c5e5f87ee0d2", + "decoded": { + "methodID": "0x24d4e90a", + "args": [ + "0x00000000000000000000000000000000000000000000000324bf7e0976f5f167" + ] + } }, { "type": "DELEGATECALL", @@ -210,7 +241,13 @@ "gas": "0x748c7", "gasUsed": "0x265", "input": "0x872fb2b5000000000000000000000000000000000000000000000000c330b3f7006420b8", - "output": "0x00000000000000000000000000000000000000000000000224bf7df2c80f0878" + "output": "0x00000000000000000000000000000000000000000000000224bf7df2c80f0878", + "decoded": { + "methodID": "0x872fb2b5", + "args": [ + "0x000000000000000000000000000000000000000000000000c330b3f7006420b8" + ] + } }, { "type": "DELEGATECALL", @@ -220,7 +257,13 @@ "gas": "0x744c2", "gasUsed": "0x265", "input": "0x872fb2b500000000000000000000000000000000000000000000000237d37fe5d297a500", - "output": "0x0000000000000000000000000000000000000000000000093088c407fcbbce38" + "output": "0x0000000000000000000000000000000000000000000000093088c407fcbbce38", + "decoded": { + "methodID": "0x872fb2b5", + "args": [ + "0x00000000000000000000000000000000000000000000000237d37fe5d297a500" + ] + } }, { "type": "DELEGATECALL", @@ -230,9 +273,28 @@ "gas": "0x74142", "gasUsed": "0xc99", "input": "0x24d4e90a00000000000000000000000000000000000000000000000b554841fac4cad6b0", - "output": "0x0000000000000000000000000000000000000000000000026d7fc130d6a74cbe" + "output": "0x0000000000000000000000000000000000000000000000026d7fc130d6a74cbe", + "decoded": { + "methodID": "0x24d4e90a", + "args": [ + "0x00000000000000000000000000000000000000000000000b554841fac4cad6b0" + ] + } } - ] + ], + "decoded": { + "methodID": "0x0439978d", + "args": [ + "0xe9efd3ab89acad6a3edf9828c3b00ed1c4a74e974d05d32d3b2fb15aa16fc377", + "0x0000000000000000000000000000000000000000000000004563918244f40000", + "0x00000000000000000000000000000000000000000000000000000000000000a0", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x000000000000000000000000000000000000000000000000de0b6b3a76400000", + "0x0000000000000000000000000000000000000000000000000000000000000002", + "0x00000000000000000000000000000000000000000000000026566ea1ec2f6a9b", + "0x00000000000000000000000000000000000000000000000072aa5b7e04d56a9b" + ] + } }, { "type": "CALL", @@ -242,7 +304,34 @@ "gas": "0x731be", "gasUsed": "0x241", "input": "0xc51cf179000000000000000000000000000000000000000000000000de0b6b3a76400000", - "output": "0x0000000000000000000000000000000000000000000000000071ea279ec31402" + "output": "0x0000000000000000000000000000000000000000000000000071ea279ec31402", + "decoded": { + "type": "erc20", + "methodID": "0xc51cf179", + "args": [ + "0x000000000000000000000000000000000000000000000000de0b6b3a76400000" + ] + } + }, + { + "type": "CALL", + "from": "0x92f1dbea03ce08225e31e95cc926ddbe0198e6f2", + "to": "0x0000000000000000000000000000000000000004", + "value": "0x0", + "gas": "0xf", + "gasUsed": "0xf", + "input": "0x", + "output": "0x" + }, + { + "type": "CALL", + "from": "0x92f1dbea03ce08225e31e95cc926ddbe0198e6f2", + "to": "0x0000000000000000000000000000000000000004", + "value": "0x0", + "gas": "0xf", + "gasUsed": "0xf", + "input": "0x", + "output": "0x" }, { "type": "CALL", @@ -253,62 +342,15 @@ "gasUsed": "0x468b", "input": "0x23b872dd0000000000000000000000003de712784baf97260455ae25fb74f574ec9c1add0000000000000000000000006ca7f214ab2ddbb9a8e1a1e2c8550e3164e9dba500000000000000000000000000000000000000000000000080d29fa5cccfadac", "output": "0x0000000000000000000000000000000000000000000000000000000000000001", - "calls": [ - { - "type": "CALL", - "from": "0x92f1dbea03ce08225e31e95cc926ddbe0198e6f2", - "to": "0x92f1dbea03ce08225e31e95cc926ddbe0198e6f2", - "value": "0x0", - "gas": "0xffffffffffffffff", - "gasUsed": "0x640a", - "input": "0x06fdde03", - "output": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", - "calls": [ - { - "type": "CALL", - "from": "0x92f1dbea03ce08225e31e95cc926ddbe0198e6f2", - "to": "0x0000000000000000000000000000000000000004", - "value": "0x0", - "gas": "0xf", - "gasUsed": "0xf", - "input": "0x", - "output": "0x" - } - ] - }, - { - "type": "CALL", - "from": "0x92f1dbea03ce08225e31e95cc926ddbe0198e6f2", - "to": "0x92f1dbea03ce08225e31e95cc926ddbe0198e6f2", - "value": "0x0", - "gas": "0xffffffffffffffff", - "gasUsed": "0x2fc", - "input": "0x95d89b41", - "output": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", - "calls": [ - { - "type": "CALL", - "from": "0x92f1dbea03ce08225e31e95cc926ddbe0198e6f2", - "to": "0x0000000000000000000000000000000000000004", - "value": "0x0", - "gas": "0xf", - "gasUsed": "0xf", - "input": "0x", - "output": "0x" - } - ] - }, - { - "type": "CALL", - "from": "0x92f1dbea03ce08225e31e95cc926ddbe0198e6f2", - "to": "0x92f1dbea03ce08225e31e95cc926ddbe0198e6f2", - "value": "0x0", - "gas": "0xffffffffffffffff", - "gasUsed": "0x138", - "input": "0x313ce567", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000" - } - ] + "decoded": { + "type": "erc20", + "methodID": "0x23b872dd", + "args": [ + "0x3dE712784baf97260455aE25fb74f574EC9c1add", + "0x6CA7f214AB2ddbB9A8E1A1e2C8550e3164E9dbA5", + "9282657316418596268" + ] + } }, { "type": "CALL", @@ -318,7 +360,15 @@ "gas": "0x6e627", "gasUsed": "0x56d6", "input": "0x095ea7b30000000000000000000000005aae5c59d642e5fd45b427df6ed478b49d55fefd00000000000000000000000000000000000000000000000080d29fa5cccfadac", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "type": "erc20", + "methodID": "0x095ea7b3", + "args": [ + "0x0000000000000000000000005aae5c59d642e5fd45b427df6ed478b49d55fefd", + "0x00000000000000000000000000000000000000000000000080d29fa5cccfadac" + ] + } }, { "type": "CALL", @@ -338,7 +388,16 @@ "gas": "0x629ff", "gasUsed": "0x468b", "input": "0x23b872dd0000000000000000000000006ca7f214ab2ddbb9a8e1a1e2c8550e3164e9dba50000000000000000000000005aae5c59d642e5fd45b427df6ed478b49d55fefd00000000000000000000000000000000000000000000000080d29fa5cccfadac", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "type": "erc20", + "methodID": "0x23b872dd", + "args": [ + "0x6CA7f214AB2ddbB9A8E1A1e2C8550e3164E9dbA5", + "0x5aaE5c59D642E5fD45b427Df6eD478b49d55FEfD", + "9282657316418596268" + ] + } }, { "type": "CALL", @@ -348,7 +407,15 @@ "gas": "0x5e0df", "gasUsed": "0x31af", "input": "0xa9059cbb000000000000000000000000950ca4a06c78934a148b7a3ff3ea8fc366f77a060000000000000000000000000000000000000000000000000041f50e27d56848", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "type": "erc20", + "methodID": "0xa9059cbb", + "args": [ + "0x950CA4a06c78934a148B7a3Ff3Ea8fC366f77A06", + "18565314632837192" + ] + } }, { "type": "CALL", @@ -358,7 +425,15 @@ "gas": "0x5ac6b", "gasUsed": "0x29ae", "input": "0x475a9fa90000000000000000000000006ca7f214ab2ddbb9a8e1a1e2c8550e3164e9dba50000000000000000000000000000000000000000000000008090aa97a4fa4564", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "type": "erc20", + "methodID": "0x475a9fa9", + "args": [ + "0x0000000000000000000000006ca7f214ab2ddbb9a8e1a1e2c8550e3164e9dba5", + "0x0000000000000000000000000000000000000000000000008090aa97a4fa4564" + ] + } }, { "type": "CALL", @@ -368,9 +443,25 @@ "gas": "0x57fed", "gasUsed": "0x29ae", "input": "0x475a9fa90000000000000000000000006ca7f214ab2ddbb9a8e1a1e2c8550e3164e9dba50000000000000000000000000000000000000000000000008090aa97a4fa4564", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "type": "erc20", + "methodID": "0x475a9fa9", + "args": [ + "0x0000000000000000000000006ca7f214ab2ddbb9a8e1a1e2c8550e3164e9dba5", + "0x0000000000000000000000000000000000000000000000008090aa97a4fa4564" + ] + } } - ] + ], + "decoded": { + "type": "erc20", + "methodID": "0x07d5b826", + "args": [ + "0xd9a4ffe21d19763887176173d08241e8393c1dfd208f29193dfecdf854b664ac", + "0x00000000000000000000000000000000000000000000000080d29fa5cccfadac" + ] + } }, { "type": "CALL", @@ -380,7 +471,35 @@ "gas": "0x56030", "gasUsed": "0x265", "input": "0x1f0c1e0cd9a4ffe21d19763887176173d08241e8393c1dfd208f29193dfecdf854b664ac0000000000000000000000000000000000000000000000000000000000000001", - "output": "0x000000000000000000000000f4cbd7e037b80c2e67b80512d482685f15b1fb28" + "output": "0x000000000000000000000000f4cbd7e037b80c2e67b80512d482685f15b1fb28", + "decoded": { + "type": "erc20", + "methodID": "0x1f0c1e0c", + "args": [ + "0xd9a4ffe21d19763887176173d08241e8393c1dfd208f29193dfecdf854b664ac", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] + } + }, + { + "type": "CALL", + "from": "0xf4cbd7e037b80c2e67b80512d482685f15b1fb28", + "to": "0x0000000000000000000000000000000000000004", + "value": "0x0", + "gas": "0xf", + "gasUsed": "0xf", + "input": "0x", + "output": "0x" + }, + { + "type": "CALL", + "from": "0xf4cbd7e037b80c2e67b80512d482685f15b1fb28", + "to": "0x0000000000000000000000000000000000000004", + "value": "0x0", + "gas": "0xf", + "gasUsed": "0xf", + "input": "0x", + "output": "0x" }, { "type": "CALL", @@ -392,60 +511,6 @@ "input": "0xa9059cbb0000000000000000000000003de712784baf97260455ae25fb74f574ec9c1add000000000000000000000000000000000000000000000000de0b6b3a76400000", "output": "0x0000000000000000000000000000000000000000000000000000000000000001", "calls": [ - { - "type": "CALL", - "from": "0xf4cbd7e037b80c2e67b80512d482685f15b1fb28", - "to": "0xf4cbd7e037b80c2e67b80512d482685f15b1fb28", - "value": "0x0", - "gas": "0xffffffffffffffff", - "gasUsed": "0x1a2", - "input": "0x06fdde03", - "output": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", - "calls": [ - { - "type": "CALL", - "from": "0xf4cbd7e037b80c2e67b80512d482685f15b1fb28", - "to": "0x0000000000000000000000000000000000000004", - "value": "0x0", - "gas": "0xf", - "gasUsed": "0xf", - "input": "0x", - "output": "0x" - } - ] - }, - { - "type": "CALL", - "from": "0xf4cbd7e037b80c2e67b80512d482685f15b1fb28", - "to": "0xf4cbd7e037b80c2e67b80512d482685f15b1fb28", - "value": "0x0", - "gas": "0xffffffffffffffff", - "gasUsed": "0x252", - "input": "0x95d89b41", - "output": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", - "calls": [ - { - "type": "CALL", - "from": "0xf4cbd7e037b80c2e67b80512d482685f15b1fb28", - "to": "0x0000000000000000000000000000000000000004", - "value": "0x0", - "gas": "0xf", - "gasUsed": "0xf", - "input": "0x", - "output": "0x" - } - ] - }, - { - "type": "CALL", - "from": "0xf4cbd7e037b80c2e67b80512d482685f15b1fb28", - "to": "0xf4cbd7e037b80c2e67b80512d482685f15b1fb28", - "value": "0x0", - "gas": "0xffffffffffffffff", - "gasUsed": "0xe8", - "input": "0x313ce567", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, { "type": "DELEGATECALL", "from": "0xf4cbd7e037b80c2e67b80512d482685f15b1fb28", @@ -454,11 +519,36 @@ "gas": "0x55a8a", "gasUsed": "0x30f7", "input": "0x88d5fecb00000000000000000000000000000000000000000000000000000000000000010000000000000000000000003de712784baf97260455ae25fb74f574ec9c1add000000000000000000000000000000000000000000000000de0b6b3a76400000", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0x88d5fecb", + "args": [ + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000003de712784baf97260455ae25fb74f574ec9c1add", + "0x000000000000000000000000000000000000000000000000de0b6b3a76400000" + ] + } } - ] + ], + "decoded": { + "type": "erc20", + "methodID": "0xa9059cbb", + "args": [ + "0x3dE712784baf97260455aE25fb74f574EC9c1add", + "16000000000000000000" + ] + } } ], + "decoded": { + "methodID": "0xbbd4f854", + "args": [ + "0xe9efd3ab89acad6a3edf9828c3b00ed1c4a74e974d05d32d3b2fb15aa16fc377", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x000000000000000000000000000000000000000000000000de0b6b3a76400000", + "0x00000000000000000000000000000000000000000000000080d29fa5cccfadac" + ] + }, "blockContext": { "number": 2340153, "stateRoot": "0xfd6b6b8e67375609b44379ad18b293b1d6369d8e93e17f8240600a3f990caeae", @@ -469,159 +559,147 @@ }, "balanceChanges": [ { - "address": "0x950ca4a06c78934a148b7a3ff3ea8fc366f77a06", + "address": "0x3de712784baf97260455ae25fb74f574ec9c1add", "balanceChanges": [ { - "delta": "18565314632837192", + "delta": "-3074620000000000", + "asset": { + "address": "0x0000000000000000000000000000000000000000", + "type": "eth", + "name": "Ether", + "symbol": "ETH", + "decimals": 18 + }, + "breakdown": [ + { + "counterparty": "0x0000000000000000000000000000000000000000", + "amount": "-2569103278080" + }, + { + "counterparty": "0x61c808d82a3ac53231750dadc13c777b59310bd9", + "amount": "-3072050896721920" + } + ] + }, + { + "delta": "-9282657316418596268", "asset": { "address": "0x92f1dbea03ce08225e31e95cc926ddbe0198e6f2", - "type": "erc20", - "name": "", - "symbol": "" + "type": "erc20" }, "breakdown": [ { - "counterparty": "0x5aae5c59d642e5fd45b427df6ed478b49d55fefd", - "amount": "18565314632837192" + "counterparty": "0x6ca7f214ab2ddbb9a8e1a1e2c8550e3164e9dba5", + "amount": "-9282657316418596268" } ] - } - ] - }, - { - "address": "0x61c808d82a3ac53231750dadc13c777b59310bd9", - "balanceChanges": [ + }, { - "delta": "3072050896721920", + "delta": "16000000000000000000", "asset": { - "address": "0x0000000000000000000000000000000000000000", - "type": "eth", - "name": "Ether", - "symbol": "ETH", - "decimals": 18 + "address": "0xf4cbd7e037b80c2e67b80512d482685f15b1fb28", + "type": "erc20" }, "breakdown": [ { - "counterparty": "0x3de712784baf97260455ae25fb74f574ec9c1add", - "amount": "3072050896721920" + "counterparty": "0x6ca7f214ab2ddbb9a8e1a1e2c8550e3164e9dba5", + "amount": "16000000000000000000" } ] } ] }, { - "address": "0x6ca7f214ab2ddbb9a8e1a1e2c8550e3164e9dba5", + "address": "0x5aae5c59d642e5fd45b427df6ed478b49d55fefd", "balanceChanges": [ { - "delta": "0", + "delta": "9264092001785759076", "asset": { "address": "0x92f1dbea03ce08225e31e95cc926ddbe0198e6f2", - "type": "erc20", - "name": "", - "symbol": "" + "type": "erc20" }, "breakdown": [ { - "counterparty": "0x3de712784baf97260455ae25fb74f574ec9c1add", + "counterparty": "0x6ca7f214ab2ddbb9a8e1a1e2c8550e3164e9dba5", "amount": "9282657316418596268" }, { - "counterparty": "0x5aae5c59d642e5fd45b427df6ed478b49d55fefd", - "amount": "-9282657316418596268" + "counterparty": "0x950ca4a06c78934a148b7a3ff3ea8fc366f77a06", + "amount": "-18565314632837192" } ] - }, + } + ] + }, + { + "address": "0x61c808d82a3ac53231750dadc13c777b59310bd9", + "balanceChanges": [ { - "delta": "-16000000000000000000", + "delta": "3072050896721920", "asset": { - "address": "0xf4cbd7e037b80c2e67b80512d482685f15b1fb28", - "type": "erc20", - "name": "", - "symbol": "" + "address": "0x0000000000000000000000000000000000000000", + "type": "eth", + "name": "Ether", + "symbol": "ETH", + "decimals": 18 }, "breakdown": [ { "counterparty": "0x3de712784baf97260455ae25fb74f574ec9c1add", - "amount": "-16000000000000000000" + "amount": "3072050896721920" } ] } ] }, { - "address": "0x3de712784baf97260455ae25fb74f574ec9c1add", + "address": "0x6ca7f214ab2ddbb9a8e1a1e2c8550e3164e9dba5", "balanceChanges": [ { - "delta": "-9282657316418596268", + "delta": "0", "asset": { "address": "0x92f1dbea03ce08225e31e95cc926ddbe0198e6f2", - "type": "erc20", - "name": "", - "symbol": "" + "type": "erc20" }, "breakdown": [ { - "counterparty": "0x6ca7f214ab2ddbb9a8e1a1e2c8550e3164e9dba5", + "counterparty": "0x3de712784baf97260455ae25fb74f574ec9c1add", + "amount": "9282657316418596268" + }, + { + "counterparty": "0x5aae5c59d642e5fd45b427df6ed478b49d55fefd", "amount": "-9282657316418596268" } ] }, { - "delta": "16000000000000000000", + "delta": "-16000000000000000000", "asset": { "address": "0xf4cbd7e037b80c2e67b80512d482685f15b1fb28", - "type": "erc20", - "name": "", - "symbol": "" - }, - "breakdown": [ - { - "counterparty": "0x6ca7f214ab2ddbb9a8e1a1e2c8550e3164e9dba5", - "amount": "16000000000000000000" - } - ] - }, - { - "delta": "-3074620000000000", - "asset": { - "address": "0x0000000000000000000000000000000000000000", - "type": "eth", - "name": "Ether", - "symbol": "ETH", - "decimals": 18 + "type": "erc20" }, "breakdown": [ { - "counterparty": "0x0000000000000000000000000000000000000000", - "amount": "-2569103278080" - }, - { - "counterparty": "0x61c808d82a3ac53231750dadc13c777b59310bd9", - "amount": "-3072050896721920" + "counterparty": "0x3de712784baf97260455ae25fb74f574ec9c1add", + "amount": "-16000000000000000000" } ] } ] }, { - "address": "0x5aae5c59d642e5fd45b427df6ed478b49d55fefd", + "address": "0x950ca4a06c78934a148b7a3ff3ea8fc366f77a06", "balanceChanges": [ { - "delta": "9264092001785759076", + "delta": "18565314632837192", "asset": { "address": "0x92f1dbea03ce08225e31e95cc926ddbe0198e6f2", - "type": "erc20", - "name": "", - "symbol": "" + "type": "erc20" }, "breakdown": [ { - "counterparty": "0x6ca7f214ab2ddbb9a8e1a1e2c8550e3164e9dba5", - "amount": "9282657316418596268" - }, - { - "counterparty": "0x950ca4a06c78934a148b7a3ff3ea8fc366f77a06", - "amount": "-18565314632837192" + "counterparty": "0x5aae5c59d642e5fd45b427df6ed478b49d55fefd", + "amount": "18565314632837192" } ] } diff --git a/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/balance_changes_erc20_transfer.json b/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/erc20_transfer.json similarity index 90% rename from eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/balance_changes_erc20_transfer.json rename to eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/erc20_transfer.json index 88848d8b53a6..42aeeac1da89 100644 --- a/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/balance_changes_erc20_transfer.json +++ b/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/erc20_transfer.json @@ -11,7 +11,7 @@ "number": "16967879", "stateRoot": "0xb0fe203965f60ee45cf6686f06e2f9b0fe228446b668b3a5c1466b4eabca1dca", "timestamp": "1674198911", - "totalDifficulty": "5.8750003716598352816469e+22", + "totalDifficulty": "5.8750003716598352816469e+22", "alloc": { "0xf527A5Ee2155fAD99A5bBB23c9e52B0a11b99dD4": { "balance": "0x3C3A38E5AB72FC0000", @@ -20,7 +20,7 @@ "0x4675c7e5baafbffbca748158becba61ef3b0a263": { "balance": "0xF6F4BEE9A8FB32" }, - "0xc3761EB917CD790B30dAD99f6Cc5b4Ff93C4F9eA" : { + "0xc3761EB917CD790B30dAD99f6Cc5b4Ff93C4F9eA": { "balance": "0x0", "code": "0x60606040526002805460ff19166012179055341561001c57600080fd5b604051610a1f380380610a1f833981016040528080519190602001805182019190602001805160025460ff16600a0a85026003819055600160a060020a03331660009081526004602052604081209190915592019190508280516100849291602001906100a1565b5060018180516100989291602001906100a1565b5050505061013c565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100e257805160ff191683800117855561010f565b8280016001018555821561010f579182015b8281111561010f5782518255916020019190600101906100f4565b5061011b92915061011f565b5090565b61013991905b8082111561011b5760008155600101610125565b90565b6108d48061014b6000396000f3006060604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100be578063095ea7b31461014857806318160ddd1461017e57806323b872dd146101a3578063313ce567146101cb57806342966c68146101f457806370a082311461020a57806379cc67901461022957806395d89b411461024b578063a9059cbb1461025e578063cae9ca5114610282578063dd62ed3e146102e7575b600080fd5b34156100c957600080fd5b6100d161030c565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561010d5780820151838201526020016100f5565b50505050905090810190601f16801561013a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015357600080fd5b61016a600160a060020a03600435166024356103aa565b604051901515815260200160405180910390f35b341561018957600080fd5b6101916103da565b60405190815260200160405180910390f35b34156101ae57600080fd5b61016a600160a060020a03600435811690602435166044356103e0565b34156101d657600080fd5b6101de610457565b60405160ff909116815260200160405180910390f35b34156101ff57600080fd5b61016a600435610460565b341561021557600080fd5b610191600160a060020a03600435166104eb565b341561023457600080fd5b61016a600160a060020a03600435166024356104fd565b341561025657600080fd5b6100d16105d9565b341561026957600080fd5b610280600160a060020a0360043516602435610644565b005b341561028d57600080fd5b61016a60048035600160a060020a03169060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061065395505050505050565b34156102f257600080fd5b610191600160a060020a0360043581169060243516610785565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103a25780601f10610377576101008083540402835291602001916103a2565b820191906000526020600020905b81548152906001019060200180831161038557829003601f168201915b505050505081565b600160a060020a033381166000908152600560209081526040808320938616835292905220819055600192915050565b60035481565b600160a060020a0380841660009081526005602090815260408083203390941683529290529081205482111561041557600080fd5b600160a060020a038085166000908152600560209081526040808320339094168352929052208054839003905561044d8484846107a2565b5060019392505050565b60025460ff1681565b600160a060020a0333166000908152600460205260408120548290101561048657600080fd5b600160a060020a03331660008181526004602052604090819020805485900390556003805485900390557fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59084905190815260200160405180910390a2506001919050565b60046020526000908152604090205481565b600160a060020a0382166000908152600460205260408120548290101561052357600080fd5b600160a060020a038084166000908152600560209081526040808320339094168352929052205482111561055657600080fd5b600160a060020a038084166000818152600460209081526040808320805488900390556005825280832033909516835293905282902080548590039055600380548590039055907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59084905190815260200160405180910390a250600192915050565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103a25780601f10610377576101008083540402835291602001916103a2565b61064f3383836107a2565b5050565b60008361066081856103aa565b1561077d5780600160a060020a0316638f4ffcb1338630876040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018085600160a060020a0316600160a060020a0316815260200184815260200183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107165780820151838201526020016106fe565b50505050905090810190601f1680156107435780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b151561076457600080fd5b6102c65a03f1151561077557600080fd5b505050600191505b509392505050565b600560209081526000928352604080842090915290825290205481565b6000600160a060020a03831615156107b957600080fd5b600160a060020a038416600090815260046020526040902054829010156107df57600080fd5b600160a060020a0383166000908152600460205260409020548281011161080557600080fd5b50600160a060020a0380831660008181526004602052604080822080549488168084528284208054888103909155938590528154870190915591909301927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a3600160a060020a038084166000908152600460205260408082205492871682529020540181146108a257fe5b505050505600a165627a7a72305820604ef788ac8abdaedc46b8f7086ffceec1d1e365e29400b7d236b16d0498065000290000000000000000000000000000000000000000000000000000002540be4000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000005455243323000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054552433230000000000000000000000000000000000000000000000000000000", "storage": { @@ -44,7 +44,7 @@ } }, "tracerConfig": { - "balanceChanges": true + "decode": true }, "context": { "number": "16967879", @@ -56,13 +56,21 @@ "input": "0x02f8b301038505b3524e108505b3524e108405f5e10094c3761eb917cd790b30dad99f6cc5b4ff93c4f9ea80b844a9059cbb000000000000000000000000fba9f22d040e53e5fac36698080cee3dd3792262000000000000000000000000000000000000000000000207b733832c88c007cac080a07371e0060c5a04e594e52bc949f0155ef29c9205cfce0dffebe6cef23a68c8eba00ff5c780cf75d1e6eeb9d08719e2988bb09e1f4bd18af3ee357dd47186265160", "result": { "type": "CALL", - "from": "0xc3761eb917cd790b30dad99f6cc5b4ff93c4f9ea", + "from": "0xf527a5ee2155fad99a5bbb23c9e52b0a11b99dd4", "to": "0xc3761eb917cd790b30dad99f6cc5b4ff93c4f9ea", "value": "0x0", - "gas": "0xffffffffffffffff", + "gas": "0x5f58c50", "gasUsed": "0x60b4", - "input": "0x06fdde03", + "input": "0xa9059cbb000000000000000000000000fba9f22d040e53e5fac36698080cee3dd3792262000000000000000000000000000000000000000000000207b733832c88c007ca", "output": "0x6060604052600436106100b95763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100be578063095ea7b31461014857806318160ddd1461017e57806323b872dd146101a3578063313ce567146101cb57806342966c68146101f457806370a082311461020a57806379cc67901461022957806395d89b411461024b578063a9059cbb1461025e578063cae9ca5114610282578063dd62ed3e146102e7575b600080fd5b34156100c957600080fd5b6100d161030c565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561010d5780820151838201526020016100f5565b50505050905090810190601f16801561013a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015357600080fd5b61016a600160a060020a03600435166024356103aa565b604051901515815260200160405180910390f35b341561018957600080fd5b6101916103da565b60405190815260200160405180910390f35b34156101ae57600080fd5b61016a600160a060020a03600435811690602435166044356103e0565b34156101d657600080fd5b6101de610457565b60405160ff909116815260200160405180910390f35b34156101ff57600080fd5b61016a600435610460565b341561021557600080fd5b610191600160a060020a03600435166104eb565b341561023457600080fd5b61016a600160a060020a03600435166024356104fd565b341561025657600080fd5b6100d16105d9565b341561026957600080fd5b610280600160a060020a0360043516602435610644565b005b341561028d57600080fd5b61016a60048035600160a060020a03169060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061065395505050505050565b34156102f257600080fd5b610191600160a060020a0360043581169060243516610785565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103a25780601f10610377576101008083540402835291602001916103a2565b820191906000526020600020905b81548152906001019060200180831161038557829003601f168201915b505050505081565b600160a060020a033381166000908152600560209081526040808320938616835292905220819055600192915050565b60035481565b600160a060020a0380841660009081526005602090815260408083203390941683529290529081205482111561041557600080fd5b600160a060020a038085166000908152600560209081526040808320339094168352929052208054839003905561044d8484846107a2565b5060019392505050565b60025460ff1681565b600160a060020a0333166000908152600460205260408120548290101561048657600080fd5b600160a060020a03331660008181526004602052604090819020805485900390556003805485900390557fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59084905190815260200160405180910390a2506001919050565b60046020526000908152604090205481565b600160a060020a0382166000908152600460205260408120548290101561052357600080fd5b600160a060020a038084166000908152600560209081526040808320339094168352929052205482111561055657600080fd5b600160a060020a038084166000818152600460209081526040808320805488900390556005825280832033909516835293905282902080548590039055600380548590039055907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59084905190815260200160405180910390a250600192915050565b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103a25780601f10610377576101008083540402835291602001916103a2565b61064f3383836107a2565b5050565b60008361066081856103aa565b1561077d5780600160a060020a0316638f4ffcb1338630876040518563ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018085600160a060020a0316600160a060020a0316815260200184815260200183600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156107165780820151838201526020016106fe565b50505050905090810190601f1680156107435780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b151561076457600080fd5b6102c65a03f1151561077557600080fd5b505050600191505b509392505050565b600560209081526000928352604080842090915290825290205481565b6000600160a060020a03831615156107b957600080fd5b600160a060020a038416600090815260046020526040902054829010156107df57600080fd5b600160a060020a0383166000908152600460205260409020548281011161080557600080fd5b50600160a060020a0380831660008181526004602052604080822080549488168084528284208054888103909155938590528154870190915591909301927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a3600160a060020a038084166000908152600460205260408082205492871682529020540181146108a257fe5b505050505600a165627a7a72305820604ef788ac8abdaedc46b8f7086ffceec1d1e365e29400b7d236b16d049806500029", + "decoded": { + "type": "erc20", + "methodID": "0xa9059cbb", + "args": [ + "0xFbA9F22D040e53e5FAc36698080cee3dD3792262", + "9587061213415306430410" + ] + }, "blockContext": { "number": 16967879, "stateRoot": "0xb4c1f5fda0d1aaa56f040ad7e7fb9d527603a0223236c11aeafad13162bcaf12", @@ -73,10 +81,10 @@ }, "balanceChanges": [ { - "address": "0xf527a5ee2155fad99a5bbb23c9e52b0a11b99dd4", + "address": "0x4675c7e5baafbffbca748158becba61ef3b0a263", "balanceChanges": [ { - "delta": "-776416061160960", + "delta": "605696149742400", "asset": { "address": "0x0000000000000000000000000000000000000000", "type": "eth", @@ -86,30 +94,37 @@ }, "breakdown": [ { - "counterparty": "0x0000000000000000000000000000000000000000", - "amount": "-116246446080" - }, - { - "counterparty": "0x4675c7e5baafbffbca748158becba61ef3b0a263", - "amount": "-170189950622400" - }, - { - "counterparty": "0x0000000000000000000000000000000000000000", - "amount": "-413714350080" - }, + "counterparty": "0xf527a5ee2155fad99a5bbb23c9e52b0a11b99dd4", + "amount": "605696149742400" + } + ] + } + ] + }, + { + "address": "0xfba9f22d040e53e5fac36698080cee3dd3792262", + "balanceChanges": [ + { + "delta": "9587061213415306430410", + "asset": { + "address": "0xc3761eb917cd790b30dad99f6cc5b4ff93c4f9ea", + "type": "erc20", + "decimals": 41 + }, + "breakdown": [ { - "counterparty": "0x4675c7e5baafbffbca748158becba61ef3b0a263", - "amount": "-605696149742400" + "counterparty": "0xf527a5ee2155fad99a5bbb23c9e52b0a11b99dd4", + "amount": "9587061213415306430410" } ] } ] }, { - "address": "0x4675c7e5baafbffbca748158becba61ef3b0a263", + "address": "0xf527a5ee2155fad99a5bbb23c9e52b0a11b99dd4", "balanceChanges": [ { - "delta": "775886100364800", + "delta": "-606109864092480", "asset": { "address": "0x0000000000000000000000000000000000000000", "type": "eth", @@ -119,12 +134,26 @@ }, "breakdown": [ { - "counterparty": "0xf527a5ee2155fad99a5bbb23c9e52b0a11b99dd4", - "amount": "170189950622400" + "counterparty": "0x0000000000000000000000000000000000000000", + "amount": "-413714350080" }, { - "counterparty": "0xf527a5ee2155fad99a5bbb23c9e52b0a11b99dd4", - "amount": "605696149742400" + "counterparty": "0x4675c7e5baafbffbca748158becba61ef3b0a263", + "amount": "-605696149742400" + } + ] + }, + { + "delta": "-9587061213415306430410", + "asset": { + "address": "0xc3761eb917cd790b30dad99f6cc5b4ff93c4f9ea", + "type": "erc20", + "decimals": 41 + }, + "breakdown": [ + { + "counterparty": "0xfba9f22d040e53e5fac36698080cee3dd3792262", + "amount": "-9587061213415306430410" } ] } diff --git a/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/erc20_transfer_netbalchanges_txns.json b/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/erc20_transfer2.json similarity index 97% rename from eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/erc20_transfer_netbalchanges_txns.json rename to eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/erc20_transfer2.json index c236b5893adb..abf313e832c2 100644 --- a/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/erc20_transfer_netbalchanges_txns.json +++ b/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/erc20_transfer2.json @@ -70,6 +70,13 @@ "gasUsed": "0x6ccd", "input": "0xa9059cbb000000000000000000000000dbf03b407c01e7cd3cbea99509d93f8dddc8c6fb0000000000000000000000000000000000000000000000000000000000989680", "output": "0x", + "decoded": { + "methodID": "0xa9059cbb", + "args": [ + "0xdbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB", + "10000000" + ] + }, "blockContext": { "number": 765825, "stateRoot": "0x1f1f6c87fe91d6d6024316d28d51481cf05cd68345dc26425a175786ab77a14f", @@ -80,35 +87,32 @@ }, "balanceChanges": [ { - "address": "0xdbf03b407c01e7cd3cbea99509d93f8dddc8c6fb", + "address": "0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb", "balanceChanges": [ { - "delta": "10000000", + "delta": "-1392650000000000", "asset": { - "address": "0xf4eced2f682ce333f96f2d8966c613ded8fc95dd", - "type": "unknown", - "name": "", - "symbol": "" + "address": "0x0000000000000000000000000000000000000000", + "type": "eth", + "name": "Ether", + "symbol": "ETH", + "decimals": 18 }, "breakdown": [ { - "counterparty": "0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb", - "amount": "10000000" + "counterparty": "0x0000000000000000000000000000000000000000", + "amount": "-465470423040" + }, + { + "counterparty": "0xe2fe6b13287f28e193333fdfe7fedf2f6df6124a", + "amount": "-1392184529576960" } ] - } - ] - }, - { - "address": "0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb", - "balanceChanges": [ + }, { "delta": "-10000000", "asset": { - "address": "0xf4eced2f682ce333f96f2d8966c613ded8fc95dd", - "type": "unknown", - "name": "", - "symbol": "" + "address": "0xf4eced2f682ce333f96f2d8966c613ded8fc95dd" }, "breakdown": [ { @@ -116,24 +120,21 @@ "amount": "-10000000" } ] - }, + } + ] + }, + { + "address": "0xdbf03b407c01e7cd3cbea99509d93f8dddc8c6fb", + "balanceChanges": [ { - "delta": "-1392650000000000", + "delta": "10000000", "asset": { - "address": "0x0000000000000000000000000000000000000000", - "type": "eth", - "name": "Ether", - "symbol": "ETH", - "decimals": 18 + "address": "0xf4eced2f682ce333f96f2d8966c613ded8fc95dd" }, "breakdown": [ { - "counterparty": "0x0000000000000000000000000000000000000000", - "amount": "-465470423040" - }, - { - "counterparty": "0xe2fe6b13287f28e193333fdfe7fedf2f6df6124a", - "amount": "-1392184529576960" + "counterparty": "0xd1220a0cf47c7b9be7a2e6ba89f429762e7b9adb", + "amount": "10000000" } ] } diff --git a/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/inner_create.json b/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/inner_create.json index 344e98f8c3f1..b3d3a082a11b 100644 --- a/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/inner_create.json +++ b/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/inner_create.json @@ -231,7 +231,10 @@ "gas": "0x1f51ad", "gasUsed": "0xe7", "input": "0x0a16697a", - "output": "0x000000000000000000000000000000000000000000000000000000000010365c" + "output": "0x000000000000000000000000000000000000000000000000000000000010365c", + "decoded": { + "methodID": "0x0a16697a" + } }, { "type": "CALL", @@ -241,7 +244,10 @@ "gas": "0x1f4fd8", "gasUsed": "0xe7", "input": "0x0a16697a", - "output": "0x000000000000000000000000000000000000000000000000000000000010365c" + "output": "0x000000000000000000000000000000000000000000000000000000000010365c", + "decoded": { + "methodID": "0x0a16697a" + } }, { "type": "CALL", @@ -251,7 +257,10 @@ "gas": "0x1f4e03", "gasUsed": "0xe7", "input": "0x0a16697a", - "output": "0x000000000000000000000000000000000000000000000000000000000010365c" + "output": "0x000000000000000000000000000000000000000000000000000000000010365c", + "decoded": { + "methodID": "0x0a16697a" + } }, { "type": "CALL", @@ -261,7 +270,10 @@ "gas": "0x1f4c34", "gasUsed": "0x2c4", "input": "0xa06db7dc", - "output": "0x00000000000000000000000000000000000000000000000000000000000000ff" + "output": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "decoded": { + "methodID": "0xa06db7dc" + } }, { "type": "CALL", @@ -271,9 +283,18 @@ "gas": "0x1f488d", "gasUsed": "0xe7", "input": "0x0a16697a", - "output": "0x000000000000000000000000000000000000000000000000000000000010365c" + "output": "0x000000000000000000000000000000000000000000000000000000000010365c", + "decoded": { + "methodID": "0x0a16697a" + } } - ] + ], + "decoded": { + "methodID": "0x5054d98a", + "args": [ + "0x0000000000000000000000000000000000000000000000000000000000000003" + ] + } }, { "type": "CALLCODE", @@ -293,7 +314,10 @@ "gas": "0x1f430e", "gasUsed": "0xe7", "input": "0x0a16697a", - "output": "0x000000000000000000000000000000000000000000000000000000000010365c" + "output": "0x000000000000000000000000000000000000000000000000000000000010365c", + "decoded": { + "methodID": "0x0a16697a" + } }, { "type": "CALL", @@ -303,7 +327,10 @@ "gas": "0x1f413e", "gasUsed": "0x2c4", "input": "0xa06db7dc", - "output": "0x00000000000000000000000000000000000000000000000000000000000000ff" + "output": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "decoded": { + "methodID": "0xa06db7dc" + } }, { "type": "CALL", @@ -313,7 +340,10 @@ "gas": "0x1f3dcd", "gasUsed": "0xe7", "input": "0x0a16697a", - "output": "0x000000000000000000000000000000000000000000000000000000000010365c" + "output": "0x000000000000000000000000000000000000000000000000000000000010365c", + "decoded": { + "methodID": "0x0a16697a" + } }, { "type": "CALL", @@ -323,7 +353,10 @@ "gas": "0x1f3bca", "gasUsed": "0xe7", "input": "0x0a16697a", - "output": "0x000000000000000000000000000000000000000000000000000000000010365c" + "output": "0x000000000000000000000000000000000000000000000000000000000010365c", + "decoded": { + "methodID": "0x0a16697a" + } }, { "type": "CALL", @@ -333,9 +366,20 @@ "gas": "0x1f39f4", "gasUsed": "0x2c4", "input": "0xa06db7dc", - "output": "0x00000000000000000000000000000000000000000000000000000000000000ff" + "output": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "decoded": { + "methodID": "0xa06db7dc" + } } - ] + ], + "decoded": { + "methodID": "0xa1873db6", + "args": [ + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x000000000000000000000000b834e3edfc1a927bdcecb67a9d0eccbd752a5bb3", + "0x00000000000000000000000000000000000000000000000000000000001fa874" + ] + } }, { "type": "CALLCODE", @@ -365,7 +409,10 @@ "gas": "0x1d5753", "gasUsed": "0xe7", "input": "0x0a16697a", - "output": "0x000000000000000000000000000000000000000000000000000000000010365c" + "output": "0x000000000000000000000000000000000000000000000000000000000010365c", + "decoded": { + "methodID": "0x0a16697a" + } }, { "type": "CALL", @@ -385,7 +432,10 @@ "gas": "0x1d365c", "gasUsed": "0x114", "input": "0x8e46afa9", - "output": "0x00000000000000000000000000000000000000000000000000000000000000ff" + "output": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "decoded": { + "methodID": "0x8e46afa9" + } }, { "type": "CALLCODE", @@ -395,7 +445,10 @@ "gas": "0x1d3458", "gasUsed": "0x141", "input": "0x971c803f", - "output": "0x000000000000000000000000000000000000000000000000000000000000000a" + "output": "0x000000000000000000000000000000000000000000000000000000000000000a", + "decoded": { + "methodID": "0x971c803f" + } }, { "type": "CALL", @@ -455,13 +508,51 @@ "gas": "0xe2039", "gasUsed": "0x3624d", "input": "0xbacd69580000000000000000000000000000000000000000000000000000000000000001000000000000000000000000651913977e8140c323997fce5e03c19e0015eebf0000000000000000000000000000000000000000000000000000000000103847", - "output": "0x" + "output": "0x", + "decoded": { + "methodID": "0xbacd6958", + "args": [ + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x000000000000000000000000651913977e8140c323997fce5e03c19e0015eebf", + "0x0000000000000000000000000000000000000000000000000000000000103847" + ] + } } - ] + ], + "decoded": { + "methodID": "0x50d4e411", + "args": [ + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000007dd677b54fc954824a7bc49bd26cbdfa12c75adf", + "0x0000000000000000000000007dd677b54fc954824a7bc49bd26cbdfa12c75adf", + "0x3defb96200000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000001a0", + "0x00000000000000000000000000000000000000000000000000000000000000ff", + "0x000000000000000000000000000000000000000000000000000000000000000a", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000103847", + "0x00000000000000000000000000000000000000000000000000000000001e8480", + "0x0000000000000000000000000000000000000000000000000011f8119429ed3a", + "0x00000000000000000000000000000000000000000000000000002e002d006b55", + "0x00000000000000000000000000000000000000000000000029a2241af62c0000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ] + } } - ] + ], + "decoded": { + "methodID": "0x8c0e156d", + "args": [ + "0x3defb96200000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000103847", + "0x00000000000000000000000000000000000000000000000000000000001e8480" + ] + } } - ] + ], + "decoded": { + "methodID": "0x3defb962" + } }, { "type": "CALL", @@ -471,7 +562,10 @@ "gas": "0xbed5c", "gasUsed": "0x2bf", "input": "0x938b5f32", - "output": "0x0000000000000000000000006c8f2a135f6ed072de4503bd7c4999a1a17f824b" + "output": "0x0000000000000000000000006c8f2a135f6ed072de4503bd7c4999a1a17f824b", + "decoded": { + "methodID": "0x938b5f32" + } }, { "type": "CALL", @@ -491,7 +585,14 @@ "gas": "0xbe349", "gasUsed": "0x238", "input": "0xed5bd7ea0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000741467b251fca923d6229c4b439078b55dca233b", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0xed5bd7ea", + "args": [ + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x000000000000000000000000741467b251fca923d6229c4b439078b55dca233b" + ] + } }, { "type": "CALL", @@ -501,7 +602,10 @@ "gas": "0xb7e5e", "gasUsed": "0x323", "input": "0xc6502da8", - "output": "0x0000000000000000000000000000000000000000000000000011f79bd42b0c7c" + "output": "0x0000000000000000000000000000000000000000000000000011f79bd42b0c7c", + "decoded": { + "methodID": "0xc6502da8" + } }, { "type": "CALL", @@ -511,7 +615,10 @@ "gas": "0xb7a9b", "gasUsed": "0x356", "input": "0xc6803622", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0xc6803622" + } }, { "type": "CALL", @@ -521,9 +628,15 @@ "gas": "0xb765e", "gasUsed": "0x3de", "input": "0xd379be23", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000" + "output": "0x0000000000000000000000000000000000000000000000000000000000000000", + "decoded": { + "methodID": "0xd379be23" + } } - ] + ], + "decoded": { + "methodID": "0xe6470fbe" + } }, { "type": "CALL", @@ -533,7 +646,10 @@ "gas": "0xbd195", "gasUsed": "0x323", "input": "0xc6502da8", - "output": "0x0000000000000000000000000000000000000000000000000011f79bd42b0c7c" + "output": "0x0000000000000000000000000000000000000000000000000011f79bd42b0c7c", + "decoded": { + "methodID": "0xc6502da8" + } }, { "type": "CALL", @@ -543,7 +659,10 @@ "gas": "0xbcd3c", "gasUsed": "0x21b", "input": "0x625cc465", - "output": "0x00000000000000000000000000000000000000000000000000002dfeff8fca5d" + "output": "0x00000000000000000000000000000000000000000000000000002dfeff8fca5d", + "decoded": { + "methodID": "0x625cc465" + } }, { "type": "CALLCODE", @@ -565,7 +684,14 @@ "input": "0x", "output": "0x" } - ] + ], + "decoded": { + "methodID": "0x12c82bcc", + "args": [ + "0x000000000000000000000000b834e3edfc1a927bdcecb67a9d0eccbd752a5bb3", + "0x00000000000000000000000000000000000000000000000001035c689778647c" + ] + } }, { "type": "CALLCODE", @@ -587,9 +713,26 @@ "input": "0x", "output": "0x" } - ] + ], + "decoded": { + "methodID": "0x12c82bcc", + "args": [ + "0x000000000000000000000000d3cda913deb6f67967b99d67acdfa1712c293601", + "0x00000000000000000000000000000000000000000000000000002dfeff8fca5d" + ] + } } - ] + ], + "decoded": { + "methodID": "0xda46be0a", + "args": [ + "0x0000000000000000000000000000000000000000000000000000000000000003", + "0x00000000000000000000000000000000000000000000000000000000001fa874", + "0x000000000000000000000000b834e3edfc1a927bdcecb67a9d0eccbd752a5bb3", + "0x00000000000000000000000000000000000000000000000000000000000186a0", + "0x0000000000000000000000000000000000000000000000000000000000012cc8" + ] + } }, { "type": "CALLCODE", @@ -621,11 +764,28 @@ "input": "0x", "output": "0x" } - ] + ], + "decoded": { + "methodID": "0x12c82bcc", + "args": [ + "0x0000000000000000000000007dd677b54fc954824a7bc49bd26cbdfa12c75adf", + "0x00000000000000000000000000000000000000000000000028c288eb0779ea1f" + ] + } } - ] + ], + "decoded": { + "methodID": "0xc17e6817", + "args": [ + "0x0000000000000000000000007dd677b54fc954824a7bc49bd26cbdfa12c75adf", + "0x00000000000000000000000000000000000000000000000028c288eb0779ea1f" + ] + } } ], + "decoded": { + "methodID": "0x61461954" + }, "blockContext": { "number": 1062503, "stateRoot": "0xf33ed6bf51d6a1a0a8c160c99bc265f8578fa68e56730c810a085e8a63aa49c4", @@ -639,7 +799,7 @@ "address": "0x6c8f2a135f6ed072de4503bd7c4999a1a17f824b", "balanceChanges": [ { - "delta": "0", + "delta": "3000000000000000000", "asset": { "address": "0x0000000000000000000000000000000000000000", "type": "eth", @@ -651,10 +811,6 @@ { "counterparty": "0x7dd677b54fc954824a7bc49bd26cbdfa12c75adf", "amount": "3000000000000000000" - }, - { - "counterparty": "0x651913977e8140c323997fce5e03c19e0015eebf", - "amount": "-3000000000000000000" } ] } @@ -664,7 +820,7 @@ "address": "0x7dd677b54fc954824a7bc49bd26cbdfa12c75adf", "balanceChanges": [ { - "delta": "-62939549976892897", + "delta": "-3000000000000000000", "asset": { "address": "0x0000000000000000000000000000000000000000", "type": "eth", @@ -676,31 +832,6 @@ { "counterparty": "0x6c8f2a135f6ed072de4503bd7c4999a1a17f824b", "amount": "-3000000000000000000" - }, - { - "counterparty": "0x741467b251fca923d6229c4b439078b55dca233b", - "amount": "2937060450023107103" - } - ] - } - ] - }, - { - "address": "0x651913977e8140c323997fce5e03c19e0015eebf", - "balanceChanges": [ - { - "delta": "3000000000000000000", - "asset": { - "address": "0x0000000000000000000000000000000000000000", - "type": "eth", - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "breakdown": [ - { - "counterparty": "0x6c8f2a135f6ed072de4503bd7c4999a1a17f824b", - "amount": "3000000000000000000" } ] } @@ -710,7 +841,7 @@ "address": "0xb834e3edfc1a927bdcecb67a9d0eccbd752a5bb3", "balanceChanges": [ { - "delta": "7409523255663740", + "delta": "-65594100000000000", "asset": { "address": "0x0000000000000000000000000000000000000000", "type": "eth", @@ -719,10 +850,6 @@ "decimals": 18 }, "breakdown": [ - { - "counterparty": "0x741467b251fca923d6229c4b439078b55dca233b", - "amount": "73003623255663740" - }, { "counterparty": "0x0000000000000000000000000000000000000000", "amount": "-21923752181760" @@ -735,56 +862,6 @@ } ] }, - { - "address": "0x741467b251fca923d6229c4b439078b55dca233b", - "balanceChanges": [ - { - "delta": "-3010114646511327480", - "asset": { - "address": "0x0000000000000000000000000000000000000000", - "type": "eth", - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "breakdown": [ - { - "counterparty": "0xb834e3edfc1a927bdcecb67a9d0eccbd752a5bb3", - "amount": "-73003623255663740" - }, - { - "counterparty": "0xd3cda913deb6f67967b99d67acdfa1712c293601", - "amount": "-50573232556637" - }, - { - "counterparty": "0x7dd677b54fc954824a7bc49bd26cbdfa12c75adf", - "amount": "-2937060450023107103" - } - ] - } - ] - }, - { - "address": "0xd3cda913deb6f67967b99d67acdfa1712c293601", - "balanceChanges": [ - { - "delta": "50573232556637", - "asset": { - "address": "0x0000000000000000000000000000000000000000", - "type": "eth", - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "breakdown": [ - { - "counterparty": "0x741467b251fca923d6229c4b439078b55dca233b", - "amount": "50573232556637" - } - ] - } - ] - }, { "address": "0x2a65aca4d5fc5b5c859090a6c34d164135398226", "balanceChanges": [ diff --git a/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/multi_contracts_netbalchanges_txns.json b/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/multi_contracts_transfers.json similarity index 86% rename from eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/multi_contracts_netbalchanges_txns.json rename to eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/multi_contracts_transfers.json index 4c5e064b43fc..866969690066 100644 --- a/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/multi_contracts_netbalchanges_txns.json +++ b/eth/tracers/internal/tracetest/testdata/txnOpCode_tracer_with_netbalchanges/multi_contracts_transfers.json @@ -316,7 +316,10 @@ "gas": "0x34affa", "gasUsed": "0x1ef", "input": "0x4b6753bc", - "output": "0x0000000000000000000000000000000000000000000000000000000057870858" + "output": "0x0000000000000000000000000000000000000000000000000000000057870858", + "decoded": { + "methodID": "0x4b6753bc" + } }, { "type": "CALL", @@ -326,7 +329,13 @@ "gas": "0x34abef", "gasUsed": "0x314", "input": "0x70a08231000000000000000000000000c0ee9db1a9e07ca63e4ff0d5fb6f86bf68d47b89", - "output": "0x00000000000000000000000000000000000000000001819451f999d617dafa93" + "output": "0x00000000000000000000000000000000000000000001819451f999d617dafa93", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x000000000000000000000000c0ee9db1a9e07ca63e4ff0d5fb6f86bf68d47b89" + ] + } }, { "type": "CALL", @@ -336,7 +345,13 @@ "gas": "0x34a705", "gasUsed": "0x314", "input": "0x70a08231000000000000000000000000c0ee9db1a9e07ca63e4ff0d5fb6f86bf68d47b89", - "output": "0x00000000000000000000000000000000000000000001819451f999d617dafa93" + "output": "0x00000000000000000000000000000000000000000001819451f999d617dafa93", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x000000000000000000000000c0ee9db1a9e07ca63e4ff0d5fb6f86bf68d47b89" + ] + } }, { "type": "CALL", @@ -356,9 +371,23 @@ "gas": "0x343e8c", "gasUsed": "0x9a62", "input": "0xa9059cbb0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd00000000000000000000000000000000000000000001819451f999d617dafa93", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0xa9059cbb", + "args": [ + "0x4FD27b205895e698fa350F7ea57CeC8a21927FCD", + "1820847120949253496306323" + ] + } } - ] + ], + "decoded": { + "methodID": "0xa9059cbb", + "args": [ + "0x4FD27b205895e698fa350F7ea57CeC8a21927FCD", + "1820847120949253496306323" + ] + } }, { "type": "CALL", @@ -378,7 +407,13 @@ "gas": "0x339a3b", "gasUsed": "0x329", "input": "0x81f03fcb0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000" + "output": "0x0000000000000000000000000000000000000000000000000000000000000000", + "decoded": { + "methodID": "0x81f03fcb", + "args": [ + "0x0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd" + ] + } }, { "type": "CALL", @@ -388,7 +423,10 @@ "gas": "0x3395a4", "gasUsed": "0x15f", "input": "0x0e708203", - "output": "0x000000000000000000000000ad3ecf23c0c8983b07163708be6d763b5f056193" + "output": "0x000000000000000000000000ad3ecf23c0c8983b07163708be6d763b5f056193", + "decoded": { + "methodID": "0x0e708203" + } }, { "type": "CALL", @@ -398,7 +436,10 @@ "gas": "0x339363", "gasUsed": "0x113", "input": "0xd2cc718f", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000" + "output": "0x0000000000000000000000000000000000000000000000000000000000000000", + "decoded": { + "methodID": "0xd2cc718f" + } }, { "type": "CALL", @@ -408,7 +449,13 @@ "gas": "0x339129", "gasUsed": "0x329", "input": "0x81f03fcb0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000" + "output": "0x0000000000000000000000000000000000000000000000000000000000000000", + "decoded": { + "methodID": "0x81f03fcb", + "args": [ + "0x0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd" + ] + } }, { "type": "CALL", @@ -418,7 +465,10 @@ "gas": "0x338cfa", "gasUsed": "0x13f", "input": "0x18160ddd", - "output": "0x00000000000000000000000000000000000000000003034f5ca7d45e17df199b" + "output": "0x00000000000000000000000000000000000000000003034f5ca7d45e17df199b", + "decoded": { + "methodID": "0x18160ddd" + } }, { "type": "CALL", @@ -428,9 +478,21 @@ "gas": "0x338a75", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd", - "output": "0x00000000000000000000000000000000000000000001819451f999d617dafa93" + "output": "0x00000000000000000000000000000000000000000001819451f999d617dafa93", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd" + ] + } } - ] + ], + "decoded": { + "methodID": "0xa8618f71", + "args": [ + "0x0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd" + ] + } }, { "type": "CALL", @@ -440,7 +502,13 @@ "gas": "0x33e6f2", "gasUsed": "0x314", "input": "0x70a08231000000000000000000000000f835a0247b0063c04ef22006ebe57c5f11977cc4", - "output": "0x00000000000000000000000000000000000000000001819451f999d617dafa76" + "output": "0x00000000000000000000000000000000000000000001819451f999d617dafa76", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x000000000000000000000000f835a0247b0063c04ef22006ebe57c5f11977cc4" + ] + } }, { "type": "CALL", @@ -450,7 +518,13 @@ "gas": "0x33e208", "gasUsed": "0x314", "input": "0x70a08231000000000000000000000000f835a0247b0063c04ef22006ebe57c5f11977cc4", - "output": "0x00000000000000000000000000000000000000000001819451f999d617dafa76" + "output": "0x00000000000000000000000000000000000000000001819451f999d617dafa76", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x000000000000000000000000f835a0247b0063c04ef22006ebe57c5f11977cc4" + ] + } }, { "type": "CALL", @@ -470,9 +544,23 @@ "gas": "0x337992", "gasUsed": "0x5fca", "input": "0xa9059cbb0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd00000000000000000000000000000000000000000001819451f999d617dafa76", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0xa9059cbb", + "args": [ + "0x4FD27b205895e698fa350F7ea57CeC8a21927FCD", + "1820847120949253496306294" + ] + } } - ] + ], + "decoded": { + "methodID": "0xa9059cbb", + "args": [ + "0x4FD27b205895e698fa350F7ea57CeC8a21927FCD", + "1820847120949253496306294" + ] + } }, { "type": "CALL", @@ -492,7 +580,13 @@ "gas": "0x330fd9", "gasUsed": "0x329", "input": "0x81f03fcb0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000" + "output": "0x0000000000000000000000000000000000000000000000000000000000000000", + "decoded": { + "methodID": "0x81f03fcb", + "args": [ + "0x0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd" + ] + } }, { "type": "CALL", @@ -502,7 +596,10 @@ "gas": "0x330b42", "gasUsed": "0x15f", "input": "0x0e708203", - "output": "0x000000000000000000000000ad3ecf23c0c8983b07163708be6d763b5f056193" + "output": "0x000000000000000000000000ad3ecf23c0c8983b07163708be6d763b5f056193", + "decoded": { + "methodID": "0x0e708203" + } }, { "type": "CALL", @@ -512,7 +609,10 @@ "gas": "0x330901", "gasUsed": "0x113", "input": "0xd2cc718f", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000" + "output": "0x0000000000000000000000000000000000000000000000000000000000000000", + "decoded": { + "methodID": "0xd2cc718f" + } }, { "type": "CALL", @@ -522,7 +622,13 @@ "gas": "0x3306c7", "gasUsed": "0x329", "input": "0x81f03fcb0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000" + "output": "0x0000000000000000000000000000000000000000000000000000000000000000", + "decoded": { + "methodID": "0x81f03fcb", + "args": [ + "0x0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd" + ] + } }, { "type": "CALL", @@ -532,7 +638,10 @@ "gas": "0x330298", "gasUsed": "0x13f", "input": "0x18160ddd", - "output": "0x00000000000000000000000000000000000000000003034f5ca7d45e17df199b" + "output": "0x00000000000000000000000000000000000000000003034f5ca7d45e17df199b", + "decoded": { + "methodID": "0x18160ddd" + } }, { "type": "CALL", @@ -542,9 +651,21 @@ "gas": "0x330013", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd", - "output": "0x000000000000000000000000000000000000000000030328a3f333ac2fb5f509" + "output": "0x000000000000000000000000000000000000000000030328a3f333ac2fb5f509", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd" + ] + } } - ] + ], + "decoded": { + "methodID": "0xa8618f71", + "args": [ + "0x0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd" + ] + } }, { "type": "CALL", @@ -564,7 +685,10 @@ "gas": "0x32e30d", "gasUsed": "0x15f", "input": "0x0e708203", - "output": "0x000000000000000000000000ad3ecf23c0c8983b07163708be6d763b5f056193" + "output": "0x000000000000000000000000ad3ecf23c0c8983b07163708be6d763b5f056193", + "decoded": { + "methodID": "0x0e708203" + } }, { "type": "CALL", @@ -574,7 +698,10 @@ "gas": "0x32e037", "gasUsed": "0x15f", "input": "0x0e708203", - "output": "0x000000000000000000000000ad3ecf23c0c8983b07163708be6d763b5f056193" + "output": "0x000000000000000000000000ad3ecf23c0c8983b07163708be6d763b5f056193", + "decoded": { + "methodID": "0x0e708203" + } }, { "type": "CALL", @@ -584,7 +711,10 @@ "gas": "0x32dd7b", "gasUsed": "0x113", "input": "0xd2cc718f", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000" + "output": "0x0000000000000000000000000000000000000000000000000000000000000000", + "decoded": { + "methodID": "0xd2cc718f" + } }, { "type": "CALL", @@ -594,7 +724,13 @@ "gas": "0x32daf9", "gasUsed": "0x329", "input": "0x81f03fcb0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000" + "output": "0x0000000000000000000000000000000000000000000000000000000000000000", + "decoded": { + "methodID": "0x81f03fcb", + "args": [ + "0x0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd" + ] + } }, { "type": "CALL", @@ -604,7 +740,10 @@ "gas": "0x32d6ab", "gasUsed": "0x13f", "input": "0x18160ddd", - "output": "0x00000000000000000000000000000000000000000003034f5ca7d45e17df199b" + "output": "0x00000000000000000000000000000000000000000003034f5ca7d45e17df199b", + "decoded": { + "methodID": "0x18160ddd" + } }, { "type": "CALL", @@ -614,7 +753,13 @@ "gas": "0x32d400", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd", - "output": "0x000000000000000000000000000000000000000000030328a3f333ac2fb5f509" + "output": "0x000000000000000000000000000000000000000000030328a3f333ac2fb5f509", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd" + ] + } }, { "type": "CALL", @@ -624,7 +769,13 @@ "gas": "0x32c975", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd", - "output": "0x000000000000000000000000000000000000000000030328a3f333ac2fb5f509" + "output": "0x000000000000000000000000000000000000000000030328a3f333ac2fb5f509", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd" + ] + } }, { "type": "CALL", @@ -644,7 +795,13 @@ "gas": "0x320fe1", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd", - "output": "0x000000000000000000000000000000000000000000030328a3f333ac2fb5f509" + "output": "0x000000000000000000000000000000000000000000030328a3f333ac2fb5f509", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd" + ] + } }, { "type": "CALL", @@ -654,9 +811,23 @@ "gas": "0x320b5b", "gasUsed": "0x9a62", "input": "0xa9059cbb0000000000000000000000006e715ab4f598eacf0016b9b35ef33e4141844ccc0000000000000000000000000000000000000000000181a7ae53ea2f0bef8ccd", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0xa9059cbb", + "args": [ + "0x6e715Ab4F598eACF0016b9b35Ef33e4141844CcC", + "1821204263806396353449165" + ] + } } - ] + ], + "decoded": { + "methodID": "0xd0679d34", + "args": [ + "0x0000000000000000000000006e715ab4f598eacf0016b9b35ef33e4141844ccc", + "0x0000000000000000000000000000000000000000000181a7ae53ea2f0bef8ccd" + ] + } }, { "type": "CALL", @@ -676,7 +847,10 @@ "gas": "0x3115cc", "gasUsed": "0x113", "input": "0xd2cc718f", - "output": "0x000000000000000000000000000000000000000000000004563918244f400000" + "output": "0x000000000000000000000000000000000000000000000004563918244f400000", + "decoded": { + "methodID": "0xd2cc718f" + } }, { "type": "CALL", @@ -686,7 +860,13 @@ "gas": "0x311382", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000006e715ab4f598eacf0016b9b35ef33e4141844ccc", - "output": "0x0000000000000000000000000000000000000000000181a7ae53ea2f0bef8ccd" + "output": "0x0000000000000000000000000000000000000000000181a7ae53ea2f0bef8ccd", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000006e715ab4f598eacf0016b9b35ef33e4141844ccc" + ] + } }, { "type": "CALL", @@ -696,7 +876,13 @@ "gas": "0x310f37", "gasUsed": "0x329", "input": "0x81f03fcb0000000000000000000000006e715ab4f598eacf0016b9b35ef33e4141844ccc", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000" + "output": "0x0000000000000000000000000000000000000000000000000000000000000000", + "decoded": { + "methodID": "0x81f03fcb", + "args": [ + "0x0000000000000000000000006e715ab4f598eacf0016b9b35ef33e4141844ccc" + ] + } }, { "type": "CALL", @@ -716,7 +902,10 @@ "gas": "0x30a397", "gasUsed": "0x113", "input": "0xd2cc718f", - "output": "0x000000000000000000000000000000000000000000000004563918244f400000" + "output": "0x000000000000000000000000000000000000000000000004563918244f400000", + "decoded": { + "methodID": "0xd2cc718f" + } }, { "type": "CALL", @@ -726,7 +915,10 @@ "gas": "0x309fc1", "gasUsed": "0x113", "input": "0xd2cc718f", - "output": "0x000000000000000000000000000000000000000000000004563918244f400000" + "output": "0x000000000000000000000000000000000000000000000004563918244f400000", + "decoded": { + "methodID": "0xd2cc718f" + } }, { "type": "CALL", @@ -756,7 +948,10 @@ "gas": "0x2fbb97", "gasUsed": "0x15f", "input": "0x0e708203", - "output": "0x000000000000000000000000ad3ecf23c0c8983b07163708be6d763b5f056193" + "output": "0x000000000000000000000000ad3ecf23c0c8983b07163708be6d763b5f056193", + "decoded": { + "methodID": "0x0e708203" + } }, { "type": "CALL", @@ -776,7 +971,10 @@ "gas": "0x2f3d25", "gasUsed": "0x113", "input": "0xd2cc718f", - "output": "0x000000000000000000000000000000000000000000000004563918244f400000" + "output": "0x000000000000000000000000000000000000000000000004563918244f400000", + "decoded": { + "methodID": "0xd2cc718f" + } }, { "type": "CALL", @@ -786,7 +984,10 @@ "gas": "0x2f394f", "gasUsed": "0x113", "input": "0xd2cc718f", - "output": "0x000000000000000000000000000000000000000000000004563918244f400000" + "output": "0x000000000000000000000000000000000000000000000004563918244f400000", + "decoded": { + "methodID": "0xd2cc718f" + } }, { "type": "CALL", @@ -816,7 +1017,10 @@ "gas": "0x2e5525", "gasUsed": "0x15f", "input": "0x0e708203", - "output": "0x000000000000000000000000ad3ecf23c0c8983b07163708be6d763b5f056193" + "output": "0x000000000000000000000000ad3ecf23c0c8983b07163708be6d763b5f056193", + "decoded": { + "methodID": "0x0e708203" + } }, { "type": "CALL", @@ -826,7 +1030,13 @@ "gas": "0x2e5168", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000006e715ab4f598eacf0016b9b35ef33e4141844ccc", - "output": "0x0000000000000000000000000000000000000000000181a7ae53ea2f0bef8ccd" + "output": "0x0000000000000000000000000000000000000000000181a7ae53ea2f0bef8ccd", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000006e715ab4f598eacf0016b9b35ef33e4141844ccc" + ] + } }, { "type": "CALL", @@ -836,19 +1046,46 @@ "gas": "0x2e4d69", "gasUsed": "0x5fca", "input": "0xa9059cbb0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd0000000000000000000000000000000000000000000181a7ae53ea2f0bef8ccc", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0xa9059cbb", + "args": [ + "0x4FD27b205895e698fa350F7ea57CeC8a21927FCD", + "1821204263806396353449164" + ] + } } ] } - ] + ], + "decoded": { + "methodID": "0x0221038a", + "args": [ + "0x0000000000000000000000006e715ab4f598eacf0016b9b35ef33e4141844ccc", + "0x0000000000000000000000000000000000000000000000022b1c8c12279fffff" + ] + } } - ] + ], + "decoded": { + "methodID": "0xcc9ae3f6" + } } ] } - ] + ], + "decoded": { + "methodID": "0x0221038a", + "args": [ + "0x0000000000000000000000006e715ab4f598eacf0016b9b35ef33e4141844ccc", + "0x0000000000000000000000000000000000000000000000022b1c8c12279fffff" + ] + } } - ] + ], + "decoded": { + "methodID": "0xcc9ae3f6" + } }, { "type": "CALL", @@ -858,9 +1095,19 @@ "gas": "0x2fc505", "gasUsed": "0xd4fa", "input": "0xa9059cbb0000000000000000000000006dbfc63479ffc031f23e94dc91befa38bec2c25f0000000000000000000000000000000000000000000000000000000000000001", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0xa9059cbb", + "args": [ + "0x6DBfc63479ffC031f23e94dC91bEFa38Bec2c25f", + "1" + ] + } } - ] + ], + "decoded": { + "methodID": "0xfc340716" + } }, { "type": "CALL", @@ -880,7 +1127,13 @@ "gas": "0x2eea7c", "gasUsed": "0x329", "input": "0x81f03fcb0000000000000000000000006dbfc63479ffc031f23e94dc91befa38bec2c25f", - "output": "0x000000000000000000000000000000000000000000000004563918244f3ffffe" + "output": "0x000000000000000000000000000000000000000000000004563918244f3ffffe", + "decoded": { + "methodID": "0x81f03fcb", + "args": [ + "0x0000000000000000000000006dbfc63479ffc031f23e94dc91befa38bec2c25f" + ] + } }, { "type": "CALL", @@ -890,7 +1143,13 @@ "gas": "0x2ee4cb", "gasUsed": "0x314", "input": "0x70a08231000000000000000000000000da4a4626d3e16e094de3225a751aab7128e96526", - "output": "0x000000000000000000000000000000000000000000000026b8b4a0b1e8292492" + "output": "0x000000000000000000000000000000000000000000000026b8b4a0b1e8292492", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x000000000000000000000000da4a4626d3e16e094de3225a751aab7128e96526" + ] + } }, { "type": "CALL", @@ -900,7 +1159,13 @@ "gas": "0x2edfff", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000006dbfc63479ffc031f23e94dc91befa38bec2c25f", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000006dbfc63479ffc031f23e94dc91befa38bec2c25f" + ] + } }, { "type": "CALL", @@ -920,7 +1185,13 @@ "gas": "0x2e7519", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd", - "output": "0x000000000000000000000000000000000000000000030328a3f333ac2fb5f508" + "output": "0x000000000000000000000000000000000000000000030328a3f333ac2fb5f508", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd" + ] + } }, { "type": "CALL", @@ -930,9 +1201,23 @@ "gas": "0x2e7093", "gasUsed": "0x5fca", "input": "0xa9059cbb0000000000000000000000006dbfc63479ffc031f23e94dc91befa38bec2c25f0000000000000000000000000000000000000000000000000000000000000063", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0xa9059cbb", + "args": [ + "0x6DBfc63479ffC031f23e94dC91bEFa38Bec2c25f", + "99" + ] + } } - ] + ], + "decoded": { + "methodID": "0xd0679d34", + "args": [ + "0x0000000000000000000000006dbfc63479ffc031f23e94dc91befa38bec2c25f", + "0x0000000000000000000000000000000000000000000000000000000000000063" + ] + } }, { "type": "CALL", @@ -942,7 +1227,13 @@ "gas": "0x2e6f59", "gasUsed": "0x329", "input": "0x81f03fcb000000000000000000000000da4a4626d3e16e094de3225a751aab7128e96526", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000" + "output": "0x0000000000000000000000000000000000000000000000000000000000000000", + "decoded": { + "methodID": "0x81f03fcb", + "args": [ + "0x000000000000000000000000da4a4626d3e16e094de3225a751aab7128e96526" + ] + } }, { "type": "CALL", @@ -962,7 +1253,10 @@ "gas": "0x2e06f9", "gasUsed": "0x15f", "input": "0x0e708203", - "output": "0x000000000000000000000000ad3ecf23c0c8983b07163708be6d763b5f056193" + "output": "0x000000000000000000000000ad3ecf23c0c8983b07163708be6d763b5f056193", + "decoded": { + "methodID": "0x0e708203" + } }, { "type": "CALL", @@ -972,7 +1266,10 @@ "gas": "0x2e04b8", "gasUsed": "0x113", "input": "0xd2cc718f", - "output": "0x000000000000000000000000000000000000000000000004563918244f400000" + "output": "0x000000000000000000000000000000000000000000000004563918244f400000", + "decoded": { + "methodID": "0xd2cc718f" + } }, { "type": "CALL", @@ -982,7 +1279,13 @@ "gas": "0x2e027b", "gasUsed": "0x329", "input": "0x81f03fcb000000000000000000000000da4a4626d3e16e094de3225a751aab7128e96526", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000" + "output": "0x0000000000000000000000000000000000000000000000000000000000000000", + "decoded": { + "methodID": "0x81f03fcb", + "args": [ + "0x000000000000000000000000da4a4626d3e16e094de3225a751aab7128e96526" + ] + } }, { "type": "CALL", @@ -992,7 +1295,10 @@ "gas": "0x2dfe4c", "gasUsed": "0x13f", "input": "0x18160ddd", - "output": "0x00000000000000000000000000000000000000000003034f5ca7d45e17df199b" + "output": "0x00000000000000000000000000000000000000000003034f5ca7d45e17df199b", + "decoded": { + "methodID": "0x18160ddd" + } }, { "type": "CALL", @@ -1002,9 +1308,21 @@ "gas": "0x2dfbc7", "gasUsed": "0x314", "input": "0x70a08231000000000000000000000000da4a4626d3e16e094de3225a751aab7128e96526", - "output": "0x000000000000000000000000000000000000000000000026b8b4a0b1e8292492" + "output": "0x000000000000000000000000000000000000000000000026b8b4a0b1e8292492", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x000000000000000000000000da4a4626d3e16e094de3225a751aab7128e96526" + ] + } } - ] + ], + "decoded": { + "methodID": "0x65f13792", + "args": [ + "0x000000000000000000000000da4a4626d3e16e094de3225a751aab7128e96526" + ] + } }, { "type": "CALL", @@ -1014,7 +1332,13 @@ "gas": "0x2e5281", "gasUsed": "0x329", "input": "0x81f03fcb0000000000000000000000006dbfc63479ffc031f23e94dc91befa38bec2c25f", - "output": "0x000000000000000000000000000000000000000000000004563918244f3ffffe" + "output": "0x000000000000000000000000000000000000000000000004563918244f3ffffe", + "decoded": { + "methodID": "0x81f03fcb", + "args": [ + "0x0000000000000000000000006dbfc63479ffc031f23e94dc91befa38bec2c25f" + ] + } }, { "type": "CALL", @@ -1024,7 +1348,13 @@ "gas": "0x2e4dcc", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000006dbfc63479ffc031f23e94dc91befa38bec2c25f", - "output": "0x0000000000000000000000000000000000000000000000000000000000000064" + "output": "0x0000000000000000000000000000000000000000000000000000000000000064", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000006dbfc63479ffc031f23e94dc91befa38bec2c25f" + ] + } }, { "type": "CALL", @@ -1034,7 +1364,13 @@ "gas": "0x2e4857", "gasUsed": "0x314", "input": "0x70a08231000000000000000000000000da4a4626d3e16e094de3225a751aab7128e96526", - "output": "0x000000000000000000000000000000000000000000000026b8b4a0b1e8292492" + "output": "0x000000000000000000000000000000000000000000000026b8b4a0b1e8292492", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x000000000000000000000000da4a4626d3e16e094de3225a751aab7128e96526" + ] + } }, { "type": "CALL", @@ -1044,9 +1380,19 @@ "gas": "0x2e3bae", "gasUsed": "0x9a62", "input": "0xa9059cbb000000000000000000000000da4a4626d3e16e094de3225a751aab7128e965260000000000000000000000000000000000000000000000000000000000000064", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0xa9059cbb", + "args": [ + "0xDa4a4626d3E16e094De3225A751aAb7128e96526", + "100" + ] + } } - ] + ], + "decoded": { + "methodID": "0xd95f98ce" + } }, { "type": "CALL", @@ -1056,7 +1402,13 @@ "gas": "0x2e00dc", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000" + "output": "0x0000000000000000000000000000000000000000000000000000000000000000", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b" + ] + } }, { "type": "CALL", @@ -1076,7 +1428,13 @@ "gas": "0x2d9648", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd", - "output": "0x000000000000000000000000000000000000000000030328a3f333ac2fb5f4a5" + "output": "0x000000000000000000000000000000000000000000030328a3f333ac2fb5f4a5", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd" + ] + } }, { "type": "CALL", @@ -1086,9 +1444,23 @@ "gas": "0x2d91c2", "gasUsed": "0x9a62", "input": "0xa9059cbb0000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b0000000000000000000000000000000000000000000000000000000000000001", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0xa9059cbb", + "args": [ + "0x7498BB5749c9801f1F7e490baf5F966DBFe4e97B", + "1" + ] + } } - ] + ], + "decoded": { + "methodID": "0xd0679d34", + "args": [ + "0x0000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ] + } }, { "type": "CALL", @@ -1098,7 +1470,10 @@ "gas": "0x2d57a6", "gasUsed": "0x112", "input": "0x400e3949", - "output": "0x0000000000000000000000000000000000000000000000000000000000000000" + "output": "0x0000000000000000000000000000000000000000000000000000000000000000", + "decoded": { + "methodID": "0x400e3949" + } }, { "type": "CALL", @@ -1118,7 +1493,13 @@ "gas": "0x2ceffb", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b" + ] + } }, { "type": "CALL", @@ -1170,9 +1551,25 @@ "input": "0x", "error": "out of gas" } - ] + ], + "decoded": { + "methodID": "0x612e45a3", + "args": [ + "0x000000000000000000000000be3ae5cb97c253dda67181c6e34e43f5c275e08b", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000000c0", + "0x00000000000000000000000000000000000000000000000000000000000000e0", + "0x0000000000000000000000000000000000000000000000000000000000093a80", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ] + } } - ] + ], + "decoded": { + "methodID": "0xff2f4bd2" + } }, { "type": "CALL", @@ -1182,7 +1579,10 @@ "gas": "0x2a0c87", "gasUsed": "0x112", "input": "0x400e3949", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0x400e3949" + } }, { "type": "CALL", @@ -1202,7 +1602,13 @@ "gas": "0x29a4dc", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b" + ] + } }, { "type": "CALL", @@ -1254,9 +1660,25 @@ "input": "0x", "error": "out of gas" } - ] + ], + "decoded": { + "methodID": "0x612e45a3", + "args": [ + "0x000000000000000000000000be3ae5cb97c253dda67181c6e34e43f5c275e08b", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000000c0", + "0x00000000000000000000000000000000000000000000000000000000000000e0", + "0x0000000000000000000000000000000000000000000000000000000000093a80", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ] + } } - ] + ], + "decoded": { + "methodID": "0xff2f4bd2" + } }, { "type": "CALL", @@ -1266,7 +1688,10 @@ "gas": "0x26fc00", "gasUsed": "0x112", "input": "0x400e3949", - "output": "0x0000000000000000000000000000000000000000000000000000000000000002" + "output": "0x0000000000000000000000000000000000000000000000000000000000000002", + "decoded": { + "methodID": "0x400e3949" + } }, { "type": "CALL", @@ -1286,7 +1711,13 @@ "gas": "0x269455", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b" + ] + } }, { "type": "CALL", @@ -1338,9 +1769,25 @@ "input": "0x", "error": "out of gas" } - ] + ], + "decoded": { + "methodID": "0x612e45a3", + "args": [ + "0x000000000000000000000000be3ae5cb97c253dda67181c6e34e43f5c275e08b", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000000c0", + "0x00000000000000000000000000000000000000000000000000000000000000e0", + "0x0000000000000000000000000000000000000000000000000000000000093a80", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ] + } } - ] + ], + "decoded": { + "methodID": "0xff2f4bd2" + } }, { "type": "CALL", @@ -1350,7 +1797,10 @@ "gas": "0x23eb79", "gasUsed": "0x112", "input": "0x400e3949", - "output": "0x0000000000000000000000000000000000000000000000000000000000000003" + "output": "0x0000000000000000000000000000000000000000000000000000000000000003", + "decoded": { + "methodID": "0x400e3949" + } }, { "type": "CALL", @@ -1370,7 +1820,13 @@ "gas": "0x2383ce", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b" + ] + } }, { "type": "CALL", @@ -1422,9 +1878,25 @@ "input": "0x", "error": "out of gas" } - ] + ], + "decoded": { + "methodID": "0x612e45a3", + "args": [ + "0x000000000000000000000000be3ae5cb97c253dda67181c6e34e43f5c275e08b", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000000c0", + "0x00000000000000000000000000000000000000000000000000000000000000e0", + "0x0000000000000000000000000000000000000000000000000000000000093a80", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ] + } } - ] + ], + "decoded": { + "methodID": "0xff2f4bd2" + } }, { "type": "CALL", @@ -1434,7 +1906,10 @@ "gas": "0x20daf2", "gasUsed": "0x112", "input": "0x400e3949", - "output": "0x0000000000000000000000000000000000000000000000000000000000000004" + "output": "0x0000000000000000000000000000000000000000000000000000000000000004", + "decoded": { + "methodID": "0x400e3949" + } }, { "type": "CALL", @@ -1454,7 +1929,13 @@ "gas": "0x207347", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b" + ] + } }, { "type": "CALL", @@ -1506,9 +1987,25 @@ "input": "0x", "error": "out of gas" } - ] + ], + "decoded": { + "methodID": "0x612e45a3", + "args": [ + "0x000000000000000000000000be3ae5cb97c253dda67181c6e34e43f5c275e08b", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000000c0", + "0x00000000000000000000000000000000000000000000000000000000000000e0", + "0x0000000000000000000000000000000000000000000000000000000000093a80", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ] + } } - ] + ], + "decoded": { + "methodID": "0xff2f4bd2" + } }, { "type": "CALL", @@ -1518,7 +2015,10 @@ "gas": "0x1dca6b", "gasUsed": "0x112", "input": "0x400e3949", - "output": "0x0000000000000000000000000000000000000000000000000000000000000005" + "output": "0x0000000000000000000000000000000000000000000000000000000000000005", + "decoded": { + "methodID": "0x400e3949" + } }, { "type": "CALL", @@ -1538,7 +2038,13 @@ "gas": "0x1d62c0", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b" + ] + } }, { "type": "CALL", @@ -1590,9 +2096,25 @@ "input": "0x", "error": "out of gas" } - ] + ], + "decoded": { + "methodID": "0x612e45a3", + "args": [ + "0x000000000000000000000000be3ae5cb97c253dda67181c6e34e43f5c275e08b", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000000c0", + "0x00000000000000000000000000000000000000000000000000000000000000e0", + "0x0000000000000000000000000000000000000000000000000000000000093a80", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ] + } } - ] + ], + "decoded": { + "methodID": "0xff2f4bd2" + } }, { "type": "CALL", @@ -1602,7 +2124,10 @@ "gas": "0x1ab9e4", "gasUsed": "0x112", "input": "0x400e3949", - "output": "0x0000000000000000000000000000000000000000000000000000000000000006" + "output": "0x0000000000000000000000000000000000000000000000000000000000000006", + "decoded": { + "methodID": "0x400e3949" + } }, { "type": "CALL", @@ -1622,7 +2147,13 @@ "gas": "0x1a5239", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b" + ] + } }, { "type": "CALL", @@ -1674,9 +2205,25 @@ "input": "0x", "error": "out of gas" } - ] + ], + "decoded": { + "methodID": "0x612e45a3", + "args": [ + "0x000000000000000000000000be3ae5cb97c253dda67181c6e34e43f5c275e08b", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000000c0", + "0x00000000000000000000000000000000000000000000000000000000000000e0", + "0x0000000000000000000000000000000000000000000000000000000000093a80", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ] + } } - ] + ], + "decoded": { + "methodID": "0xff2f4bd2" + } }, { "type": "CALL", @@ -1686,7 +2233,10 @@ "gas": "0x17a95d", "gasUsed": "0x112", "input": "0x400e3949", - "output": "0x0000000000000000000000000000000000000000000000000000000000000007" + "output": "0x0000000000000000000000000000000000000000000000000000000000000007", + "decoded": { + "methodID": "0x400e3949" + } }, { "type": "CALL", @@ -1706,7 +2256,13 @@ "gas": "0x1741b2", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b" + ] + } }, { "type": "CALL", @@ -1758,9 +2314,25 @@ "input": "0x", "error": "out of gas" } - ] + ], + "decoded": { + "methodID": "0x612e45a3", + "args": [ + "0x000000000000000000000000be3ae5cb97c253dda67181c6e34e43f5c275e08b", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000000c0", + "0x00000000000000000000000000000000000000000000000000000000000000e0", + "0x0000000000000000000000000000000000000000000000000000000000093a80", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ] + } } - ] + ], + "decoded": { + "methodID": "0xff2f4bd2" + } }, { "type": "CALL", @@ -1770,7 +2342,10 @@ "gas": "0x1498d6", "gasUsed": "0x112", "input": "0x400e3949", - "output": "0x0000000000000000000000000000000000000000000000000000000000000008" + "output": "0x0000000000000000000000000000000000000000000000000000000000000008", + "decoded": { + "methodID": "0x400e3949" + } }, { "type": "CALL", @@ -1790,7 +2365,13 @@ "gas": "0x14312b", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b" + ] + } }, { "type": "CALL", @@ -1842,9 +2423,25 @@ "input": "0x", "error": "out of gas" } - ] + ], + "decoded": { + "methodID": "0x612e45a3", + "args": [ + "0x000000000000000000000000be3ae5cb97c253dda67181c6e34e43f5c275e08b", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000000c0", + "0x00000000000000000000000000000000000000000000000000000000000000e0", + "0x0000000000000000000000000000000000000000000000000000000000093a80", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ] + } } - ] + ], + "decoded": { + "methodID": "0xff2f4bd2" + } }, { "type": "CALL", @@ -1854,7 +2451,10 @@ "gas": "0x11884f", "gasUsed": "0x112", "input": "0x400e3949", - "output": "0x0000000000000000000000000000000000000000000000000000000000000009" + "output": "0x0000000000000000000000000000000000000000000000000000000000000009", + "decoded": { + "methodID": "0x400e3949" + } }, { "type": "CALL", @@ -1874,7 +2474,13 @@ "gas": "0x1120a4", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000007498bb5749c9801f1f7e490baf5f966dbfe4e97b" + ] + } }, { "type": "CALL", @@ -1926,9 +2532,25 @@ "input": "0x", "error": "out of gas" } - ] + ], + "decoded": { + "methodID": "0x612e45a3", + "args": [ + "0x000000000000000000000000be3ae5cb97c253dda67181c6e34e43f5c275e08b", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000000000000000000000000000000000000000000c0", + "0x00000000000000000000000000000000000000000000000000000000000000e0", + "0x0000000000000000000000000000000000000000000000000000000000093a80", + "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000" + ] + } } - ] + ], + "decoded": { + "methodID": "0xff2f4bd2" + } }, { "type": "CALL", @@ -1938,7 +2560,10 @@ "gas": "0xe77c8", "gasUsed": "0x112", "input": "0x400e3949", - "output": "0x000000000000000000000000000000000000000000000000000000000000000a" + "output": "0x000000000000000000000000000000000000000000000000000000000000000a", + "decoded": { + "methodID": "0x400e3949" + } }, { "type": "CALL", @@ -1958,7 +2583,13 @@ "gas": "0xe0f53", "gasUsed": "0x314", "input": "0x70a082310000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd", - "output": "0x000000000000000000000000000000000000000000030328a3f333ac2fb5f4a4" + "output": "0x000000000000000000000000000000000000000000030328a3f333ac2fb5f4a4", + "decoded": { + "methodID": "0x70a08231", + "args": [ + "0x0000000000000000000000004fd27b205895e698fa350f7ea57cec8a21927fcd" + ] + } }, { "type": "CALL", @@ -1968,7 +2599,14 @@ "gas": "0xe096d", "gasUsed": "0x9a62", "input": "0xa9059cbb0000000000000000000000007ccbc69292c7a6d7b538c91f3b283de97906cf3000000000000000000000000000000000000000000001010d8bfbbbe40fe7518c", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0xa9059cbb", + "args": [ + "0x7ccbc69292C7A6D7B538c91F3B283De97906cF30", + "1213898080632835664204172" + ] + } }, { "type": "CALL", @@ -1978,7 +2616,14 @@ "gas": "0xd6871", "gasUsed": "0x9a62", "input": "0xa9059cbb0000000000000000000000001b9ec8ba24630b75a7a958153ffff56dd6d4b6a200000000000000000000000000000000000000000001010d8bfbbbe40fe7518c", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0xa9059cbb", + "args": [ + "0x1B9ec8bA24630B75a7A958153FfFF56dD6D4B6A2", + "1213898080632835664204172" + ] + } }, { "type": "CALL", @@ -1988,11 +2633,24 @@ "gas": "0xcc775", "gasUsed": "0x9a62", "input": "0xa9059cbb000000000000000000000000c3a2c744ad1f5253c736875b93bacce5b01b060b00000000000000000000000000000000000000000001010d8bfbbbe40fe7518c", - "output": "0x0000000000000000000000000000000000000000000000000000000000000001" + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "decoded": { + "methodID": "0xa9059cbb", + "args": [ + "0xc3A2C744ad1F5253C736875B93bAcCe5B01B060B", + "1213898080632835664204172" + ] + } } - ] + ], + "decoded": { + "methodID": "0x975057e7" + } } ], + "decoded": { + "methodID": "0xbe9a6555" + }, "blockContext": { "number": 1881284, "stateRoot": "0xea7933c6685792615eab2989925958331d4401cf932b58b70f5cf21897279c01", @@ -2003,68 +2661,25 @@ }, "balanceChanges": [ { - "address": "0x6dbfc63479ffc031f23e94dc91befa38bec2c25f", + "address": "0xbe3ae5cb97c253dda67181c6e34e43f5c275e08b", "balanceChanges": [ { - "delta": "0", + "delta": "-65798375000000000", "asset": { - "address": "0x304a554a310c7e546dfe434669c62820b7d83490", - "type": "unknown", - "name": "", - "symbol": "" + "address": "0x0000000000000000000000000000000000000000", + "type": "eth", + "name": "Ether", + "symbol": "ETH", + "decimals": 18 }, "breakdown": [ { - "counterparty": "0x6e715ab4f598eacf0016b9b35ef33e4141844ccc", - "amount": "1" - }, - { - "counterparty": "0x4fd27b205895e698fa350f7ea57cec8a21927fcd", - "amount": "99" + "counterparty": "0x0000000000000000000000000000000000000000", + "amount": "-43984055500800" }, { - "counterparty": "0xda4a4626d3e16e094de3225a751aab7128e96526", - "amount": "-100" - } - ] - } - ] - }, - { - "address": "0xda4a4626d3e16e094de3225a751aab7128e96526", - "balanceChanges": [ - { - "delta": "100", - "asset": { - "address": "0x304a554a310c7e546dfe434669c62820b7d83490", - "type": "unknown", - "name": "", - "symbol": "" - }, - "breakdown": [ - { - "counterparty": "0x6dbfc63479ffc031f23e94dc91befa38bec2c25f", - "amount": "100" - } - ] - } - ] - }, - { - "address": "0x7498bb5749c9801f1f7e490baf5f966dbfe4e97b", - "balanceChanges": [ - { - "delta": "1", - "asset": { - "address": "0x304a554a310c7e546dfe434669c62820b7d83490", - "type": "unknown", - "name": "", - "symbol": "" - }, - "breakdown": [ - { - "counterparty": "0x4fd27b205895e698fa350f7ea57cec8a21927fcd", - "amount": "1" + "counterparty": "0xea674fdde714fd979de3edf0f56aa9716b898ec8", + "amount": "-65754390944499200" } ] } @@ -2076,10 +2691,7 @@ { "delta": "1820847120949253496306323", "asset": { - "address": "0xc0ee9db1a9e07ca63e4ff0d5fb6f86bf68d47b89", - "type": "unknown", - "name": "", - "symbol": "" + "address": "0xc0ee9db1a9e07ca63e4ff0d5fb6f86bf68d47b89" }, "breakdown": [ { @@ -2091,10 +2703,7 @@ { "delta": "0", "asset": { - "address": "0x304a554a310c7e546dfe434669c62820b7d83490", - "type": "unknown", - "name": "", - "symbol": "" + "address": "0x304a554a310c7e546dfe434669c62820b7d83490" }, "breakdown": [ { @@ -2138,10 +2747,7 @@ { "delta": "1820847120949253496306294", "asset": { - "address": "0xf835a0247b0063c04ef22006ebe57c5f11977cc4", - "type": "unknown", - "name": "", - "symbol": "" + "address": "0xf835a0247b0063c04ef22006ebe57c5f11977cc4" }, "breakdown": [ { @@ -2153,136 +2759,88 @@ ] }, { - "address": "0xc0ee9db1a9e07ca63e4ff0d5fb6f86bf68d47b89", + "address": "0x6dbfc63479ffc031f23e94dc91befa38bec2c25f", "balanceChanges": [ { - "delta": "-1820847120949253496306323", + "delta": "0", "asset": { - "address": "0x304a554a310c7e546dfe434669c62820b7d83490", - "type": "unknown", - "name": "", - "symbol": "" + "address": "0x304a554a310c7e546dfe434669c62820b7d83490" }, "breakdown": [ + { + "counterparty": "0x6e715ab4f598eacf0016b9b35ef33e4141844ccc", + "amount": "1" + }, { "counterparty": "0x4fd27b205895e698fa350f7ea57cec8a21927fcd", - "amount": "-1820847120949253496306323" + "amount": "99" + }, + { + "counterparty": "0xda4a4626d3e16e094de3225a751aab7128e96526", + "amount": "-100" } ] } ] }, { - "address": "0xf835a0247b0063c04ef22006ebe57c5f11977cc4", + "address": "0xda4a4626d3e16e094de3225a751aab7128e96526", "balanceChanges": [ { - "delta": "-1820847120949253496306294", + "delta": "100", "asset": { - "address": "0x304a554a310c7e546dfe434669c62820b7d83490", - "type": "unknown", - "name": "", - "symbol": "" + "address": "0x304a554a310c7e546dfe434669c62820b7d83490" }, "breakdown": [ { - "counterparty": "0x4fd27b205895e698fa350f7ea57cec8a21927fcd", - "amount": "-1820847120949253496306294" + "counterparty": "0x6dbfc63479ffc031f23e94dc91befa38bec2c25f", + "amount": "100" } ] } ] }, { - "address": "0x6e715ab4f598eacf0016b9b35ef33e4141844ccc", + "address": "0x7ccbc69292c7a6d7b538c91f3b283de97906cf30", "balanceChanges": [ { - "delta": "0", + "delta": "1213898080632835664204172", "asset": { - "address": "0x304a554a310c7e546dfe434669c62820b7d83490", - "type": "unknown", - "name": "", - "symbol": "" + "address": "0x304a554a310c7e546dfe434669c62820b7d83490" }, "breakdown": [ { "counterparty": "0x4fd27b205895e698fa350f7ea57cec8a21927fcd", - "amount": "1821204263806396353449165" - }, - { - "counterparty": "0x4fd27b205895e698fa350f7ea57cec8a21927fcd", - "amount": "-1821204263806396353449164" - }, - { - "counterparty": "0x6dbfc63479ffc031f23e94dc91befa38bec2c25f", - "amount": "-1" - } - ] - }, - { - "delta": "-2", - "asset": { - "address": "0x0000000000000000000000000000000000000000", - "type": "eth", - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "breakdown": [ - { - "counterparty": "0xad3ecf23c0c8983b07163708be6d763b5f056193", - "amount": "-80000000000000000000" - }, - { - "counterparty": "0xad3ecf23c0c8983b07163708be6d763b5f056193", - "amount": "39999999999999999999" - }, - { - "counterparty": "0xad3ecf23c0c8983b07163708be6d763b5f056193", - "amount": "39999999999999999999" + "amount": "1213898080632835664204172" } ] } ] }, { - "address": "0xad3ecf23c0c8983b07163708be6d763b5f056193", + "address": "0xc3a2c744ad1f5253c736875b93bacce5b01b060b", "balanceChanges": [ { - "delta": "2", + "delta": "1213898080632835664204172", "asset": { - "address": "0x0000000000000000000000000000000000000000", - "type": "eth", - "name": "Ether", - "symbol": "ETH", - "decimals": 18 + "address": "0x304a554a310c7e546dfe434669c62820b7d83490" }, "breakdown": [ { - "counterparty": "0x6e715ab4f598eacf0016b9b35ef33e4141844ccc", - "amount": "80000000000000000000" - }, - { - "counterparty": "0x6e715ab4f598eacf0016b9b35ef33e4141844ccc", - "amount": "-39999999999999999999" - }, - { - "counterparty": "0x6e715ab4f598eacf0016b9b35ef33e4141844ccc", - "amount": "-39999999999999999999" + "counterparty": "0x4fd27b205895e698fa350f7ea57cec8a21927fcd", + "amount": "1213898080632835664204172" } ] } ] }, { - "address": "0xc3a2c744ad1f5253c736875b93bacce5b01b060b", + "address": "0x1b9ec8ba24630b75a7a958153ffff56dd6d4b6a2", "balanceChanges": [ { "delta": "1213898080632835664204172", "asset": { - "address": "0x304a554a310c7e546dfe434669c62820b7d83490", - "type": "unknown", - "name": "", - "symbol": "" + "address": "0x304a554a310c7e546dfe434669c62820b7d83490" }, "breakdown": [ { @@ -2315,35 +2873,41 @@ ] }, { - "address": "0x7ccbc69292c7a6d7b538c91f3b283de97906cf30", + "address": "0x03e3d4561a8f8e975fdcd798d32857a20cf25e7e", "balanceChanges": [ { - "delta": "1213898080632835664204172", + "delta": "-1820847120949253496306323", "asset": { - "address": "0x304a554a310c7e546dfe434669c62820b7d83490", - "type": "unknown", - "name": "", - "symbol": "" + "address": "0xc0ee9db1a9e07ca63e4ff0d5fb6f86bf68d47b89" }, "breakdown": [ { "counterparty": "0x4fd27b205895e698fa350f7ea57cec8a21927fcd", - "amount": "1213898080632835664204172" + "amount": "-1820847120949253496306323" + } + ] + }, + { + "delta": "-1820847120949253496306294", + "asset": { + "address": "0xf835a0247b0063c04ef22006ebe57c5f11977cc4" + }, + "breakdown": [ + { + "counterparty": "0x4fd27b205895e698fa350f7ea57cec8a21927fcd", + "amount": "-1820847120949253496306294" } ] } ] }, { - "address": "0x03e3d4561a8f8e975fdcd798d32857a20cf25e7e", + "address": "0xc0ee9db1a9e07ca63e4ff0d5fb6f86bf68d47b89", "balanceChanges": [ { "delta": "-1820847120949253496306323", "asset": { - "address": "0xc0ee9db1a9e07ca63e4ff0d5fb6f86bf68d47b89", - "type": "unknown", - "name": "", - "symbol": "" + "address": "0x304a554a310c7e546dfe434669c62820b7d83490" }, "breakdown": [ { @@ -2351,14 +2915,16 @@ "amount": "-1820847120949253496306323" } ] - }, + } + ] + }, + { + "address": "0xf835a0247b0063c04ef22006ebe57c5f11977cc4", + "balanceChanges": [ { "delta": "-1820847120949253496306294", "asset": { - "address": "0xf835a0247b0063c04ef22006ebe57c5f11977cc4", - "type": "unknown", - "name": "", - "symbol": "" + "address": "0x304a554a310c7e546dfe434669c62820b7d83490" }, "breakdown": [ { @@ -2370,45 +2936,42 @@ ] }, { - "address": "0x1b9ec8ba24630b75a7a958153ffff56dd6d4b6a2", + "address": "0x6e715ab4f598eacf0016b9b35ef33e4141844ccc", "balanceChanges": [ { - "delta": "1213898080632835664204172", + "delta": "0", "asset": { - "address": "0x304a554a310c7e546dfe434669c62820b7d83490", - "type": "unknown", - "name": "", - "symbol": "" + "address": "0x304a554a310c7e546dfe434669c62820b7d83490" }, "breakdown": [ { "counterparty": "0x4fd27b205895e698fa350f7ea57cec8a21927fcd", - "amount": "1213898080632835664204172" + "amount": "1821204263806396353449165" + }, + { + "counterparty": "0x4fd27b205895e698fa350f7ea57cec8a21927fcd", + "amount": "-1821204263806396353449164" + }, + { + "counterparty": "0x6dbfc63479ffc031f23e94dc91befa38bec2c25f", + "amount": "-1" } ] } ] }, { - "address": "0xbe3ae5cb97c253dda67181c6e34e43f5c275e08b", + "address": "0x7498bb5749c9801f1f7e490baf5f966dbfe4e97b", "balanceChanges": [ { - "delta": "-65798375000000000", + "delta": "1", "asset": { - "address": "0x0000000000000000000000000000000000000000", - "type": "eth", - "name": "Ether", - "symbol": "ETH", - "decimals": 18 + "address": "0x304a554a310c7e546dfe434669c62820b7d83490" }, "breakdown": [ { - "counterparty": "0x0000000000000000000000000000000000000000", - "amount": "-43984055500800" - }, - { - "counterparty": "0xea674fdde714fd979de3edf0f56aa9716b898ec8", - "amount": "-65754390944499200" + "counterparty": "0x4fd27b205895e698fa350f7ea57cec8a21927fcd", + "amount": "1" } ] } diff --git a/eth/tracers/internal/tracetest/txnOpCodeTracer_test.go b/eth/tracers/internal/tracetest/txnOpCodeTracer_test.go index 0b8849f604cd..2cd3ed6544de 100644 --- a/eth/tracers/internal/tracetest/txnOpCodeTracer_test.go +++ b/eth/tracers/internal/tracetest/txnOpCodeTracer_test.go @@ -17,6 +17,7 @@ import ( "github.com/ethereum/go-ethereum/core/vm" "github.com/ethereum/go-ethereum/eth/tracers" "github.com/ethereum/go-ethereum/eth/tracers/blocknative" + "github.com/ethereum/go-ethereum/eth/tracers/blocknative/decoder" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/tests" ) @@ -32,14 +33,14 @@ type txnOpCodeTracerTest struct { func TestTxnOpCodeTracer(t *testing.T) { log.Root().SetHandler(log.StreamHandler(os.Stdout, log.TerminalFormat(true))) - testTxnOpCodeTracer("txnOpCodeTracer", "txnOpCode_tracer", t) + //testTxnOpCodeTracer("txnOpCodeTracer", "txnOpCode_tracer", t) testTxnOpCodeTracer("txnOpCodeTracer", "txnOpCode_tracer_with_netbalchanges", t) } func testTxnOpCodeTracer(tracerName string, dirPath string, t *testing.T) { files, err := os.ReadDir(filepath.Join("testdata", dirPath)) if err != nil { - t.Fatalf("failed to retrieve tracer test suite: %v", err) + t.Fatalf("failed to retrieve tracer tgest suite: %v", err) } for _, file := range files { if !strings.HasSuffix(file.Name(), ".json") { @@ -47,7 +48,7 @@ func testTxnOpCodeTracer(tracerName string, dirPath string, t *testing.T) { } file := file t.Run(camel(strings.TrimSuffix(file.Name(), ".json")), func(t *testing.T) { - t.Parallel() + //t.Parallel() var ( test = new(txnOpCodeTracerTest) @@ -103,6 +104,7 @@ func testTxnOpCodeTracer(tracerName string, dirPath string, t *testing.T) { if _, err = st.TransitionDb(); err != nil { t.Fatalf("failed to execute transaction: %v", err) } + res, err := tracer.GetResult() if err != nil { t.Fatalf("failed to retrieve trace result: %v", err) @@ -114,27 +116,27 @@ func testTxnOpCodeTracer(tracerName string, dirPath string, t *testing.T) { if !tracesEqual(ret, test.Result) { // Below are prints to show differences if we fail, can always just check against the specific test json files too! - // x, _ := json.MarshalIndent(ret, " ", " ") - // y, _ := json.MarshalIndent(test.Result, "", "") - // fmt.Println("Trace return: ") - // fmt.Println(string(x)) - // fmt.Println("test.Result") - // fmt.Println(string(y)) - //t.Fatal("traces mismatch") - // t.Fatalf("trace mismatch: \nhave %+v\nwant %+v", ret, test.Result) - t.Fatalf("trace mismatch: \nhave %+v\nwant %+v", ret, test.Result) + //fmt.Println("Trace return: ") + //x, _ := json.Marshal(ret) + ////x, _ := json.MarshalIndent(ret, "", " ") + //y, _ := json.Marshal(test.Result) + //fmt.Println(string(x)) + //fmt.Println("test.Result") + //fmt.Println(string(y)) + t.Fatal("traces mismatch") + //t.Fatalf("trace mismatch: \nhave %+v\nwant %+v", ret, test.Result) } }) } } -type NBCByAddress blocknative.NetBalanceChanges +type NBCByAddress decoder.NetBalanceChanges func (a NBCByAddress) Len() int { return len(a) } func (a NBCByAddress) Swap(i, j int) { a[i], a[j] = a[j], a[i] } func (a NBCByAddress) Less(i, j int) bool { return a[i].Address.String() < a[j].Address.String() } -type BalanceChangesByAssetAddress []blocknative.BalanceChange +type BalanceChangesByAssetAddress []decoder.BalanceChange func (a BalanceChangesByAssetAddress) Len() int { return len(a) } func (a BalanceChangesByAssetAddress) Swap(i, j int) { a[i], a[j] = a[j], a[i] } @@ -147,7 +149,8 @@ func tracesEqual(x, y *blocknative.Trace) bool { x.Time = "" y.Time = "" - // Sort the balance changes + // Sort the balance changes because we don't care about the order of the + // breakdown. if len(x.BalanceChanges) != len(y.BalanceChanges) { return false }