// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.

package accessors

import (
	"errors"
	"math/big"
	"strings"

	ethereum "github.com/thetatoken/thetasubchain/eth"
	"github.com/thetatoken/thetasubchain/eth/abi"
	"github.com/thetatoken/thetasubchain/eth/abi/bind"
	"github.com/thetatoken/theta/common"
	"github.com/thetatoken/thetasubchain/eth/core/types"
	"github.com/thetatoken/thetasubchain/eth/event"
)

// Reference imports to suppress errors if they are not otherwise used.
var (
	_ = errors.New
	_ = big.NewInt
	_ = strings.NewReader
	_ = ethereum.NotFound
	_ = bind.Bind
	_ = common.Big1
	_ = types.BloomLookup
	_ = event.NewSubscription
)

// ChainRegistrarOnMainchainSubchainMetadata is an auto generated low-level Go binding around an user-defined struct.
type ChainRegistrarOnMainchainSubchainMetadata struct {
	Guarantor          common.Address
	CollateralAmount   *big.Int
	GovernanceToken    common.Address
	GenesisHash        string
	RegistrationHeight *big.Int
	Exists             bool
}

// ValidatorStakeManagerStake is an auto generated low-level Go binding around an user-defined struct.
type ValidatorStakeManagerStake struct {
	Validator   common.Address
	ShareAmount *big.Int
}

// ValidatorStakeManagerStakeSnapshot is an auto generated low-level Go binding around an user-defined struct.
type ValidatorStakeManagerStakeSnapshot struct {
	Height *big.Int
	Stakes []ValidatorStakeManagerStake
}

// WithdrawalQueueWithdrawalRequest is an auto generated low-level Go binding around an user-defined struct.
type WithdrawalQueueWithdrawalRequest struct {
	Receiver     common.Address
	Amount       *big.Int
	ReturnHeight *big.Int
}

// ChainRegistrarOnMainchainMetaData contains all meta data concerning the ChainRegistrarOnMainchain contract.
var ChainRegistrarOnMainchainMetaData = &bind.MetaData{
	ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wTheta_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"superAdmin_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"governor_\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"numBlocksPerDynasty_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"withdrawalPendingPeriodInBlocks_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"crossChainFee_\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"initialFeeRequired_\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"fallbackReceiver_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"slashAmount\",\"type\":\"uint256\"}],\"name\":\"SlashChainCollateral\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"guarantor\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"actualSlashedAmount\",\"type\":\"uint256\"}],\"name\":\"SlashValidatorCollateral\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"crossChainFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fallbackReceiver\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"governor\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialFeeRequired\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minChainCollateralAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minSubchainID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"numBlocksPerDynasty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"subchainCollateralReturnPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"subchainIDs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"subchainMetadataMap\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"guarantor\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"collateralAmount\",\"type\":\"uint256\"},{\"internalType\":\"contractSubchainGovernanceToken\",\"name\":\"governanceToken\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"genesisHash\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"registrationHeight\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"exists\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"superAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vcm\",\"outputs\":[{\"internalType\":\"contractValidatorCollateralManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vsm\",\"outputs\":[{\"internalType\":\"contractValidatorStakeManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"wTheta\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawalPendingPeriodInBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"governanceToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"collateralAmount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"genesisHash\",\"type\":\"string\"}],\"name\":\"registerSubchain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"additionalCollateral\",\"type\":\"uint256\"}],\"name\":\"addSubchainCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"deregisterSubchain\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"validatorCandidate\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"collateralAmount\",\"type\":\"uint256\"}],\"name\":\"depositCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"validatorCandidate\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"collateralAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"claimCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"govTokenAmount\",\"type\":\"uint256\"}],\"name\":\"depositStake\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shareAmount\",\"type\":\"uint256\"}],\"name\":\"withdrawStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"claimStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"slashAmount\",\"type\":\"uint256\"}],\"name\":\"slashChainCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"guarantor\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"slashAmount\",\"type\":\"uint256\"}],\"name\":\"slashValidatorCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newSuperAdmin\",\"type\":\"address\"}],\"name\":\"updateSuperAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"updateAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newGovernor\",\"type\":\"address\"}],\"name\":\"updateGovernor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"updateMinChainCollateralAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newInitialFeeRequired\",\"type\":\"uint256\"}],\"name\":\"updateInitialFeeRequired\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"updateMinValidatorCollateralAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"updateVCMOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"updateVSMOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newCrossChainFee\",\"type\":\"uint256\"}],\"name\":\"updateCrossChainFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newFallbackReceiver\",\"type\":\"address\"}],\"name\":\"updateFallbackReceiver\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"newPercentage\",\"type\":\"uint256\"}],\"name\":\"updateSubchainCollateralReturnPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynasty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"dynasty\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCrossChainFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFallbackReceiver\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllSubchainIDs\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"isARegisteredSubchain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"getSubchainMetadata\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"guarantor\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"collateralAmount\",\"type\":\"uint256\"},{\"internalType\":\"contractSubchainGovernanceToken\",\"name\":\"governanceToken\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"genesisHash\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"registrationHeight\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"exists\",\"type\":\"bool\"}],\"internalType\":\"structChainRegistrarOnMainchain.SubchainMetadata\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"getSubchainRegistrationHeight\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"getStakeSnapshotHeights\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNumBlocksPerDynasty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockHeight\",\"type\":\"uint256\"}],\"name\":\"getStakeSnapshot\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exists\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"targetSnapshotHeight\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"height\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"shareAmount\",\"type\":\"uint256\"}],\"internalType\":\"structValidatorStakeManager.Stake[]\",\"name\":\"stakes\",\"type\":\"tuple[]\"}],\"internalType\":\"structValidatorStakeManager.StakeSnapshot\",\"name\":\"targetStakeSnapshot\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"dynasty\",\"type\":\"uint256\"}],\"name\":\"getValidatorSet\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"validators\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"shareAmounts\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"dynasty\",\"type\":\"uint256\"}],\"name\":\"getTotalValidatorShares\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockHeight\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"getValidatorShares\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isAValidator\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"shareAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"getValidatorGuarantorsWithPendingWithdrawals\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"guarantor\",\"type\":\"address\"}],\"name\":\"getPendingValidatorCollateralWithdrawals\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"returnHeight\",\"type\":\"uint256\"}],\"internalType\":\"structWithdrawalQueue.WithdrawalRequest[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"}],\"name\":\"getStakersWithPendingWithdrawals\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subchainID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"getPendingStakeWithdrawals\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"returnHeight\",\"type\":\"uint256\"}],\"internalType\":\"structWithdrawalQueue.WithdrawalRequest[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
	Bin: "0x60806040526103e860015569021e19e0c9bab24000006002553480156200002557600080fd5b506040516200ace03803806200ace08339810160408190526200004891620001ee565b6001600055600580546001600160a01b03199081166001600160a01b038c8116919091179092556006805482168b84161790556007805482168a8416179055600880548216898416179055600387905560048690556009859055600a849055600b805490911691831691909117905560405130908a908690620000cb90620001b5565b6001600160a01b0393841681529290911660208301526040820152606001604051809103906000f08015801562000106573d6000803e3d6000fd5b50600f60006101000a8154816001600160a01b0302191690836001600160a01b03160217905550303086866040516200013f90620001c3565b6001600160a01b03948516815293909216602084015260408301526060820152608001604051809103906000f0801580156200017f573d6000803e3d6000fd5b50601080546001600160a01b0319166001600160a01b03929092169190911790555050605f600c55506200028595505050505050565b6128fc8062003ce583390190565b6146ff80620065e183390190565b80516001600160a01b0381168114620001e957600080fd5b919050565b60008060008060008060008060006101208a8c0312156200020e57600080fd5b620002198a620001d1565b98506200022960208b01620001d1565b97506200023960408b01620001d1565b96506200024960608b01620001d1565b955060808a0151945060a08a0151935060c08a0151925060e08a01519150620002766101008b01620001d1565b90509295985092959850929598565b613a5080620002956000396000f3fe6080604052600436106102e05760003560e01c80639bbb690a11610186578063d77a6e66116100d7578063eae243f811610085578063eae243f814610934578063ebea51b41461094a578063ec0903021461096a578063ecda87791461099c578063f2269521146109bc578063f851a440146109dc578063fc80ade3146109fc57600080fd5b8063d77a6e661461085f578063da0783861461087f578063dba9de6b1461089f578063dc1e8263146108b4578063e2f273bd146108d4578063e6e5e0aa146108f4578063e6eaaa811461091457600080fd5b8063ba22a7f411610134578063ba22a7f414610781578063c21d72bf146107a1578063c2ae68f4146107c1578063c49785b4146107df578063c74fba44146107ff578063cae43fd81461081f578063cec9c6e11461083f57600080fd5b80639bbb690a146106ce5780639f9106cf146106e3578063a7464b1214610703578063a74c83b714610718578063aace295714610738578063acca10881461074b578063b3f999751461076157600080fd5b80633cc41ef81161024057806362f384ad116101ee57806362f384ad146105de57806367016090146105fe5780637744f6d41461061457806378154cf7146106415780637e0c62531461066e5780639886ddbc1461068e57806399ea56b0146106ae57600080fd5b80633cc41ef8146104a75780633f216374146104c757806343b71f05146104fe57806343f27e451461054157806344669c031461056f57806344c7d6ef1461059e578063464fa557146105be57600080fd5b80631be477781161029d5780631be47778146103b95780631ead7deb146103e657806329575f6a146104065780632e31ac1e146104265780632f2c13b51461043c578063331515bc14610471578063336c73081461049157600080fd5b806307ddf6bc146102e55780630c340a241461031b5780630cc94f591461033b57806313b384991461035f578063164d29f6146103815780631911ee4114610397575b600080fd5b3480156102f157600080fd5b50601054610305906001600160a01b031681565b604051610312919061345a565b60405180910390f35b34801561032757600080fd5b50600854610305906001600160a01b031681565b34801561034757600080fd5b50610351600c5481565b604051908152602001610312565b34801561036b57600080fd5b50610374610a1c565b6040516103129190613582565b34801561038d57600080fd5b5061035160095481565b3480156103a357600080fd5b506103b76103b236600461333e565b610a74565b005b3480156103c557600080fd5b506103d96103d43660046131d4565b610d4e565b6040516103129190613520565b3480156103f257600080fd5b506103b76104013660046131a2565b610e52565b34801561041257600080fd5b50600654610305906001600160a01b031681565b34801561043257600080fd5b50610351600a5481565b34801561044857600080fd5b5061045c6104573660046131a2565b610ede565b60408051928352901515602083015201610312565b34801561047d57600080fd5b5061037461048c3660046131a2565b611000565b34801561049d57600080fd5b5061035160045481565b3480156104b357600080fd5b506103b76104c23660046131a2565b611087565b3480156104d357600080fd5b506104e76104e2366004613360565b6110ff565b604080519215158352602083019190915201610312565b34801561050a57600080fd5b506105316105193660046131a2565b6000908152600d602052604090206005015460ff1690565b6040519015158152602001610312565b34801561054d57600080fd5b5061056161055c36600461333e565b611193565b6040516103129291906134f2565b34801561057b57600080fd5b5061058f61058a36600461333e565b61122a565b60405161031293929190613595565b3480156105aa57600080fd5b506103b76105b93660046131a2565b6112de565b3480156105ca57600080fd5b506103d96105d93660046131d4565b6113fe565b3480156105ea57600080fd5b506103b76105f9366004612e67565b611430565b34801561060a57600080fd5b5061035160035481565b34801561062057600080fd5b5061063461062f3660046131a2565b61147c565b60405161031291906134df565b34801561064d57600080fd5b5061066161065c3660046131a2565b61156e565b6040516103129190613773565b34801561067a57600080fd5b5061035161068936600461333e565b611697565b34801561069a57600080fd5b506103b76106a93660046131a2565b611773565b3480156106ba57600080fd5b506103b76106c936600461324c565b6117a2565b3480156106da57600080fd5b50600954610351565b3480156106ef57600080fd5b506103b76106fe36600461324c565b6119d0565b34801561070f57600080fd5b50610351611af6565b34801561072457600080fd5b506103b7610733366004612e67565b611b78565b6103b761074636600461324c565b611bd2565b34801561075757600080fd5b5061035160015481565b34801561076d57600080fd5b506103b761077c366004612e67565b611f25565b34801561078d57600080fd5b506103b761079c3660046131a2565b611f71565b3480156107ad57600080fd5b506103b76107bc366004612e67565b611fa0565b3480156107cd57600080fd5b50600b546001600160a01b0316610305565b3480156107eb57600080fd5b506103b76107fa3660046131a2565b611ffa565b34801561080b57600080fd5b506103b761081a366004613284565b6120df565b34801561082b57600080fd5b506103b761083a366004612e67565b6123da565b34801561084b57600080fd5b506103b761085a3660046131a2565b612426565b34801561086b57600080fd5b5061035161087a3660046131a2565b612455565b34801561088b57600080fd5b506103b761089a366004613204565b612476565b3480156108ab57600080fd5b5061045c6125fa565b3480156108c057600080fd5b50600f54610305906001600160a01b031681565b3480156108e057600080fd5b506103b76108ef366004612e67565b612618565b34801561090057600080fd5b506103b761090f3660046131a2565b612664565b34801561092057600080fd5b5061063461092f3660046131a2565b612a02565b34801561094057600080fd5b5061035160025481565b34801561095657600080fd5b506103b761096536600461324c565b612a34565b34801561097657600080fd5b5061098a6109853660046131a2565b612b1d565b60405161031296959493929190613492565b3480156109a857600080fd5b506103b76109b736600461333e565b612bec565b3480156109c857600080fd5b50600b54610305906001600160a01b031681565b3480156109e857600080fd5b50600754610305906001600160a01b031681565b348015610a0857600080fd5b50600554610305906001600160a01b031681565b6060600e805480602002602001604051908101604052809291908181526020018280548015610a6a57602002820191906000526020600020905b815481526020019060010190808311610a56575b5050505050905090565b60026000541415610aa05760405162461bcd60e51b8152600401610a979061373c565b60405180910390fd5b60026000818155838152600d60209081526040808320815160c08101835281546001600160a01b0390811682526001830154948201949094529481015490921690840152600381018054929392606084019190610afc9061396a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b289061396a565b8015610b755780601f10610b4a57610100808354040283529160200191610b75565b820191906000526020600020905b815481529060010190602001808311610b5857829003601f168201915b50505091835250506004820154602082015260059091015460ff16151560409091015260a0810151909150610c015760405162461bcd60e51b815260206004820152602c60248201527f7468697320737562636861696e20494420686173206e6f74206265656e20726560448201526b19da5cdd195c9959081e595d60a21b6064820152608401610a97565b80516001600160a01b03163314610c725760405162461bcd60e51b815260206004820152602f60248201527f6f6e6c7920737562636861696e2067756172616e746f722063616e206164642060448201526e1b5bdc994818dbdb1b185d195c985b608a1b6064820152608401610a97565b6005546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90610ca69033903090879060040161346e565b602060405180830381600087803b158015610cc057600080fd5b505af1158015610cd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf89190613022565b610d145760405162461bcd60e51b8152600401610a97906136c6565b6000838152600d6020526040902060010154610d309083612cae565b6000938452600d602052604084206001908101919091559092555050565b601054604051631a9670f560e21b8152600481018490526060916001600160a01b031690636a59c3d4906024015b60206040518083038186803b158015610d9457600080fd5b505afa158015610da8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcc9190613185565b6001600160a01b0316637d031b65836040518263ffffffff1660e01b8152600401610df7919061345a565b60006040518083038186803b158015610e0f57600080fd5b505afa158015610e23573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610e4b9190810190612f23565b9392505050565b6007546001600160a01b03163314610e7c5760405162461bcd60e51b8152600401610a979061364b565b600f54604051631ead7deb60e01b8152600481018390526001600160a01b0390911690631ead7deb906024015b600060405180830381600087803b158015610ec357600080fd5b505af1158015610ed7573d6000803e3d6000fd5b5050505050565b6000818152600d60209081526040808320815160c08101835281546001600160a01b0390811682526001830154948201949094526002820154909316918301919091526003810180548493849390929091606084019190610f3e9061396a565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6a9061396a565b8015610fb75780601f10610f8c57610100808354040283529160200191610fb7565b820191906000526020600020905b815481529060010190602001808311610f9a57829003601f168201915b50505091835250506004820154602082015260059091015460ff16151560409091015260a0810151909150610ff25750600093849350915050565b608001519360019350915050565b601054604051630cc5456f60e21b8152600481018390526060916001600160a01b03169063331515bc9060240160006040518083038186803b15801561104557600080fd5b505afa158015611059573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110819190810190612fee565b92915050565b6007546001600160a01b031633146110b15760405162461bcd60e51b8152600401610a979061364b565b60648111156110fa5760405162461bcd60e51b8152602060048201526015602482015274696e76616c6964206e657750657263656e7461676560581b6044820152606401610a97565b600c55565b601054604051630fc858dd60e21b815260009182916001600160a01b0390911690633f216374906111389088908890889060040161383e565b604080518083038186803b15801561114f57600080fd5b505afa158015611163573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611187919061303d565b90969095509350505050565b6010546040516343f27e4560e01b8152600481018490526024810183905260609182916001600160a01b03909116906343f27e459060440160006040518083038186803b1580156111e357600080fd5b505afa1580156111f7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261121f9190810190612ec0565b915091509250929050565b60008061124a604051806040016040528060008152602001606081525090565b6010546040516344669c0360e01b815260048101879052602481018690526001600160a01b03909116906344669c039060440160006040518083038186803b15801561129557600080fd5b505afa1580156112a9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112d19190810190613069565b9250925092509250925092565b600260005414156113015760405162461bcd60e51b8152600401610a979061373c565b60026000556040516343b71f0560e01b81526004810182905230906343b71f059060240160206040518083038186803b15801561133d57600080fd5b505afa158015611351573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113759190613022565b6113915760405162461bcd60e51b8152600401610a9790613682565b60105460405163c0cc5e8960e01b815233916001600160a01b03169063c0cc5e89906113c390859085906004016137db565b600060405180830381600087803b1580156113dd57600080fd5b505af11580156113f1573d6000803e3d6000fd5b5050600160005550505050565b600f54604051631a9670f560e21b8152600481018490526060916001600160a01b031690636a59c3d490602401610d7c565b6007546001600160a01b0316331461145a5760405162461bcd60e51b8152600401610a979061364b565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b601054604051631a9670f560e21b8152600481018390526060916001600160a01b031690636a59c3d4906024015b60206040518083038186803b1580156114c257600080fd5b505afa1580156114d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fa9190613185565b6001600160a01b0316638a8097676040518163ffffffff1660e01b815260040160006040518083038186803b15801561153257600080fd5b505afa158015611546573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110819190810190612e84565b6040805160c080820183526000808352602080840182905283850182905260608085018190526080850183905260a08501839052868352600d8252918590208551938401865280546001600160a01b03908116855260018201549285019290925260028101549091169483019490945260038401805493949293918401916115f59061396a565b80601f01602080910402602001604051908101604052809291908181526020018280546116219061396a565b801561166e5780601f106116435761010080835404028352916020019161166e565b820191906000526020600020905b81548152906001019060200180831161165157829003601f168201915b50505091835250506004820154602082015260059091015460ff16151560409091015292915050565b6040516343f27e4560e01b81526004810183905260248101829052600090819030906343f27e459060440160006040518083038186803b1580156116da57600080fd5b505afa1580156116ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526117169190810190612ec0565b805190925090506000805b828110156117695761175584828151811061173e5761173e6139d6565b602002602001015183612cae90919063ffffffff16565b915080611761816139a5565b915050611721565b5095945050505050565b6007546001600160a01b0316331461179d5760405162461bcd60e51b8152600401610a979061364b565b600955565b600260005414156117c55760405162461bcd60e51b8152600401610a979061373c565b60026000556040516343b71f0560e01b81526004810184905230906343b71f059060240160206040518083038186803b15801561180157600080fd5b505afa158015611815573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118399190613022565b6118555760405162461bcd60e51b8152600401610a9790613682565b601054604051630fc858dd60e21b81526000916001600160a01b031690633f2163749061188a9087904390889060040161383e565b604080518083038186803b1580156118a157600080fd5b505afa1580156118b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d9919061303d565b509050801561195c5760405162461bcd60e51b815260206004820152604360248201527f636f6c6c61746572616c207769746864726177616c206e6f7420616c6c6f776560448201527f6420666f7220612076616c696461746f72207769746820616374697665207374606482015262616b6560e81b608482015260a401610a97565b600f54604051634f9b5c0b60e11b815233916001600160a01b031690639f36b81690611992908890889088908790600401613817565b600060405180830381600087803b1580156119ac57600080fd5b505af11580156119c0573d6000803e3d6000fd5b5050600160005550505050505050565b600260005414156119f35760405162461bcd60e51b8152600401610a979061373c565b60026000556040516343b71f0560e01b81526004810184905230906343b71f059060240160206040518083038186803b158015611a2f57600080fd5b505afa158015611a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a679190613022565b611a835760405162461bcd60e51b8152600401610a9790613682565b601054604051632e74e4a160e21b815233916001600160a01b03169063b9d3928490611ab9908790879087908790600401613817565b600060405180830381600087803b158015611ad357600080fd5b505af1158015611ae7573d6000803e3d6000fd5b50506001600055505050505050565b60105460408051630670160960e41b815290516000926001600160a01b0316916367016090916004808301926020929190829003018186803b158015611b3b57600080fd5b505afa158015611b4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7391906131bb565b905090565b6007546001600160a01b03163314611ba25760405162461bcd60e51b8152600401610a979061364b565b600f5460405163880cdc3160e01b81526001600160a01b039091169063880cdc3190610ea990849060040161345a565b60026000541415611bf55760405162461bcd60e51b8152600401610a979061373c565b60026000556040516343b71f0560e01b81526004810184905230906343b71f059060240160206040518083038186803b158015611c3157600080fd5b505afa158015611c45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c699190613022565b611c855760405162461bcd60e51b8152600401610a9790613682565b600a54826001600160a01b0316311015611d2557600a54600090611cb3906001600160a01b03851631612cba565b905080341015611d235760405162461bcd60e51b815260206004820152603560248201527f6e6f7420656e6f75676820544675656c20746f20636f7665722074686520696e604482015274697469616c20696e7465722d636861696e2066656560581b6064820152608401610a97565b505b6040516001600160a01b038316903480156108fc02916000818181858888f19350505050158015611d5a573d6000803e3d6000fd5b50600f5460405163cd98536b60e01b81526000916001600160a01b03169063cd98536b90611d8e90879087906004016137db565b60206040518083038186803b158015611da657600080fd5b505afa158015611dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dde91906131bb565b9050600f60009054906101000a90046001600160a01b03166001600160a01b03166335b444f06040518163ffffffff1660e01b815260040160206040518083038186803b158015611e2e57600080fd5b505afa158015611e42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6691906131bb565b811015611eef5760405162461bcd60e51b815260206004820152604b60248201527f6e65656420746f206465706f7369742073756666696369656e7420775448455460448201527f4120636f6c6c61746572616c20746f2061206e6f6465206265666f726520737460648201526a185ada5b99c81d1bc81a5d60aa1b608482015260a401610a97565b601054604051630e74fc5760e11b815233916001600160a01b031690631ce9f8ae90611992908890889088908790600401613817565b6007546001600160a01b03163314611f4f5760405162461bcd60e51b8152600401610a979061364b565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b03163314611f9b5760405162461bcd60e51b8152600401610a979061364b565b600a55565b6007546001600160a01b03163314611fca5760405162461bcd60e51b8152600401610a979061364b565b60105460405163880cdc3160e01b81526001600160a01b039091169063880cdc3190610ea990849060040161345a565b6002600054141561201d5760405162461bcd60e51b8152600401610a979061373c565b60026000556040516343b71f0560e01b81526004810182905230906343b71f059060240160206040518083038186803b15801561205957600080fd5b505afa15801561206d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120919190613022565b6120ad5760405162461bcd60e51b8152600401610a9790613682565b600f5460405163014b594760e71b815233916001600160a01b03169063a5aca380906113c390859085906004016137db565b600260005414156121025760405162461bcd60e51b8152600401610a979061373c565b600260005560015484116121585760405162461bcd60e51b815260206004820152601e60248201527f5468697320737562636861696e4944206973206e6f7420616c6c6f77656400006044820152606401610a97565b6000848152600d60205260409020600581015460ff16156121d05760405162461bcd60e51b815260206004820152602c60248201527f7468697320737562636861696e2049442068617320616c72656164792062656560448201526b1b881c9959da5cdd195c995960a21b6064820152608401610a97565b60025483101561223a5760405162461bcd60e51b815260206004820152602f60248201527f696e73756666696369656e742077544845544120636f6c6c61746572616c206660448201526e37b9103a34329039bab131b430b4b760891b6064820152608401610a97565b6005546040516323b872dd60e01b815233916001600160a01b0316906323b872dd9061226e9084903090899060040161346e565b602060405180830381600087803b15801561228857600080fd5b505af115801561229c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c09190613022565b6122dc5760405162461bcd60e51b8152600401610a97906136c6565b6040805160c0810182526001600160a01b038084168252602080830188815289831684860190815260608501898152436080870152600160a0870181905260008e8152600d865297909720865181549087166001600160a01b0319918216178255935197810197909755905160028701805491909516921691909117909255905180519293926123729260038501920190612cde565b506080820151600482015560a0909101516005909101805460ff19169115159190911790555050600e80546001818101835560009283527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd9091019590955593909355505050565b6006546001600160a01b031633146124045760405162461bcd60e51b8152600401610a97906136f9565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6007546001600160a01b031633146124505760405162461bcd60e51b8152600401610a979061364b565b600255565b600e818154811061246557600080fd5b600091825260209091200154905081565b6008546001600160a01b031633146124a05760405162461bcd60e51b8152600401610a9790613616565b6040516343b71f0560e01b81526004810185905230906343b71f059060240160206040518083038186803b1580156124d757600080fd5b505afa1580156124eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061250f9190613022565b61252b5760405162461bcd60e51b8152600401610a9790613682565b600f546040516314947a0760e21b81526000916001600160a01b031690635251e81c906125629088908890889088906004016137f2565b602060405180830381600087803b15801561257c57600080fd5b505af1158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b491906131bb565b90507f1099c09baaa6f6984b5ecea47e7a86fb0084d23b7e13a9a453629f6a3e93c62e858585846040516125eb94939291906137f2565b60405180910390a15050505050565b6003546000908190439061260e9082613912565b9360019350915050565b6006546001600160a01b031633146126425760405162461bcd60e51b8152600401610a97906136f9565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600260005414156126875760405162461bcd60e51b8152600401610a979061373c565b6002600055600f54604051634f1e404f60e01b8152600481018390526001600160a01b0390911690634f1e404f9060240160206040518083038186803b1580156126d057600080fd5b505afa1580156126e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127089190613022565b156127a15760405162461bcd60e51b815260206004820152605c60248201527f63616e6e6f7420756e7265676973746572206120737562636861696e2077686560448201527f6e20736f6d652076616c696461746f7273207374696c6c20686176652061637460648201527f697665206f7220756e636c61696d656420636f6c6c61746572616c7300000000608482015260a401610a97565b6000818152600d60209081526040808320815160c08101835281546001600160a01b0390811682526001830154948201949094526002820154909316918301919091526003810180546060840191906127f99061396a565b80601f01602080910402602001604051908101604052809291908181526020018280546128259061396a565b80156128725780601f1061284757610100808354040283529160200191612872565b820191906000526020600020905b81548152906001019060200180831161285557829003601f168201915b50505091835250506004820154602082015260059091015460ff16151560409091015260a08101519091506128b95760405162461bcd60e51b8152600401610a9790613682565b8051336001600160a01b0382161461292f5760405162461bcd60e51b815260206004820152603360248201527f6f6e6c7920737562636861696e2067756172616e746f722063616e206465726560448201527233b4b9ba32b9103a34329039bab131b430b4b760691b6064820152608401610a97565b6020820151600c546000906129529060649061294c908590612cc6565b90612cd2565b60055460405163a9059cbb60e01b81526001600160a01b0386811660048301526024820184905292935091169063a9059cbb90604401602060405180830381600087803b1580156129a257600080fd5b505af11580156129b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129da9190613022565b6129f65760405162461bcd60e51b8152600401610a97906136c6565b50506001600055505050565b600f54604051631a9670f560e21b8152600481018390526060916001600160a01b031690636a59c3d4906024016114aa565b60026000541415612a575760405162461bcd60e51b8152600401610a979061373c565b60026000556040516343b71f0560e01b81526004810184905230906343b71f059060240160206040518083038186803b158015612a9357600080fd5b505afa158015612aa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612acb9190613022565b612ae75760405162461bcd60e51b8152600401610a9790613682565b600f5460405163117a05d560e01b815233916001600160a01b03169063117a05d590611ab9908790879087908790600401613817565b600d6020526000908152604090208054600182015460028301546003840180546001600160a01b039485169593949092169291612b599061396a565b80601f0160208091040260200160405190810160405280929190818152602001828054612b859061396a565b8015612bd25780601f10612ba757610100808354040283529160200191612bd2565b820191906000526020600020905b815481529060010190602001808311612bb557829003601f168201915b50505050600483015460059093015491929160ff16905086565b6008546001600160a01b03163314612c165760405162461bcd60e51b8152600401610a9790613616565b6000828152600d60205260409020600581015460ff16612c485760405162461bcd60e51b8152600401610a9790613682565b8181600101541015612c5c57806001015491505b6001810154612c6b9083612cba565b600182015560408051848152602081018490527f75396b0e74e738b367e9c25e4168aa3b5e00d2ef5650b014c45a338ebedc5834910160405180910390a1505050565b6000610e4b82846138fa565b6000610e4b8284613953565b6000610e4b8284613934565b6000610e4b8284613912565b828054612cea9061396a565b90600052602060002090601f016020900481019282612d0c5760008555612d52565b82601f10612d2557805160ff1916838001178555612d52565b82800160010185558215612d52579182015b82811115612d52578251825591602001919060010190612d37565b50612d5e929150612d62565b5090565b5b80821115612d5e5760008155600101612d63565b600082601f830112612d8857600080fd5b81516020612d9d612d98836138d7565b6138a7565b80838252828201915082860187848660051b8901011115612dbd57600080fd5b60005b85811015612de5578151612dd381613a02565b84529284019290840190600101612dc0565b5090979650505050505050565b600082601f830112612e0357600080fd5b81516020612e13612d98836138d7565b80838252828201915082860187848660051b8901011115612e3357600080fd5b60005b85811015612de557815184529284019290840190600101612e36565b80518015158114612e6257600080fd5b919050565b600060208284031215612e7957600080fd5b8135610e4b81613a02565b600060208284031215612e9657600080fd5b81516001600160401b03811115612eac57600080fd5b612eb884828501612d77565b949350505050565b60008060408385031215612ed357600080fd5b82516001600160401b0380821115612eea57600080fd5b612ef686838701612d77565b93506020850151915080821115612f0c57600080fd5b50612f1985828601612df2565b9150509250929050565b60006020808385031215612f3657600080fd5b82516001600160401b03811115612f4c57600080fd5b8301601f81018513612f5d57600080fd5b8051612f6b612d98826138d7565b818152838101908385016060808502860187018a1015612f8a57600080fd5b60009550855b85811015612fdf5781838c031215612fa6578687fd5b612fae61385d565b8351612fb981613a02565b815283890151898201526040808501519082015285529387019391810191600101612f90565b50919998505050505050505050565b60006020828403121561300057600080fd5b81516001600160401b0381111561301657600080fd5b612eb884828501612df2565b60006020828403121561303457600080fd5b610e4b82612e52565b6000806040838503121561305057600080fd5b61305983612e52565b9150602083015190509250929050565b60008060006060848603121561307e57600080fd5b61308784612e52565b925060208085015192506040808601516001600160401b03808211156130ac57600080fd5b818801915082828a0312156130c057600080fd5b6130c8613885565b8251815284830151828111156130dd57600080fd5b80840193505089601f8401126130f257600080fd5b82519150613102612d98836138d7565b8083825286820191508685018c888660061b880101111561312257600080fd5b60009550855b8581101561316d5787828f03121561313e578687fd5b613146613885565b825161315181613a02565b8152828a01518a82015284529288019290870190600101613128565b50508087840152505080955050505050509250925092565b60006020828403121561319757600080fd5b8151610e4b81613a02565b6000602082840312156131b457600080fd5b5035919050565b6000602082840312156131cd57600080fd5b5051919050565b600080604083850312156131e757600080fd5b8235915060208301356131f981613a02565b809150509250929050565b6000806000806080858703121561321a57600080fd5b84359350602085013561322c81613a02565b9250604085013561323c81613a02565b9396929550929360600135925050565b60008060006060848603121561326157600080fd5b83359250602084013561327381613a02565b929592945050506040919091013590565b6000806000806080858703121561329a57600080fd5b843593506020808601356132ad81613a02565b93506040860135925060608601356001600160401b03808211156132d057600080fd5b818801915088601f8301126132e457600080fd5b8135818111156132f6576132f66139ec565b613308601f8201601f191685016138a7565b9150808252898482850101111561331e57600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000806040838503121561335157600080fd5b50508035926020909101359150565b60008060006060848603121561337557600080fd5b8335925060208401359150604084013561338e81613a02565b809150509250925092565b600081518084526020808501945080840160005b838110156133d25781516001600160a01b0316875295820195908201906001016133ad565b509495945050505050565b600081518084526020808501945080840160005b838110156133d2578151875295820195908201906001016133f1565b6000815180845260005b8181101561343357602081850181015186830182015201613417565b81811115613445576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b038781168252602082018790528516604082015260c0606082018190526000906134c59083018661340d565b60808301949094525090151560a090910152949350505050565b602081526000610e4b6020830184613399565b6040815260006135056040830185613399565b828103602084015261351781856133dd565b95945050505050565b602080825282518282018190526000919060409081850190868401855b8281101561357557815180516001600160a01b031685528681015187860152850151858501526060909301929085019060010161353d565b5091979650505050505050565b602081526000610e4b60208301846133dd565b8315158152600060208481840152604060608185015260a08401855160608601528286015182608087015281815180845260c0880191508583019350600092505b8083101561360857835180516001600160a01b03168352860151868301529285019260019290920191908401906135d6565b509998505050505050505050565b6020808252818101527f4f6e6c7920676f7665726e6f722063616e206d616b6520746869732063616c6c604082015260600190565b6020808252601d908201527f4f6e6c792061646d696e2063616e206d616b6520746869732063616c6c000000604082015260600190565b60208082526024908201527f74686520737562636861696e4944206973206e6f742072656769737465726564604082015263081e595d60e21b606082015260800190565b6020808252601990820152786661696c656420746f207472616e736665722077544845544160381b604082015260600190565b60208082526023908201527f4f6e6c792073757065722061646d696e2063616e206d616b6520746869732063604082015262185b1b60ea1b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208152600060018060a01b038084511660208401526020840151604084015280604085015116606084015250606083015160c060808401526137b960e084018261340d565b9050608084015160a084015260a0840151151560c08401528091505092915050565b9182526001600160a01b0316602082015260400190565b9384526001600160a01b03928316602085015291166040830152606082015260800190565b9384526001600160a01b039283166020850152604084019190915216606082015260800190565b92835260208301919091526001600160a01b0316604082015260600190565b604051606081016001600160401b038111828210171561387f5761387f6139ec565b60405290565b604080519081016001600160401b038111828210171561387f5761387f6139ec565b604051601f8201601f191681016001600160401b03811182821017156138cf576138cf6139ec565b604052919050565b60006001600160401b038211156138f0576138f06139ec565b5060051b60200190565b6000821982111561390d5761390d6139c0565b500190565b60008261392f57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561394e5761394e6139c0565b500290565b600082821015613965576139656139c0565b500390565b600181811c9082168061397e57607f821691505b6020821081141561399f57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156139b9576139b96139c0565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114613a1757600080fd5b5056fea2646970667358221220e6cae5b7fec5a1f567817d0ce94d01270b5a8cfdcaa39eb57ffdbc9a6072e8ec64736f6c634300080700336080604052683635c9adc5dea0000060015534801561001d57600080fd5b50604051620028fc380380620028fc83398101604081905261003e91610092565b600080546001600160a01b039485166001600160a01b03199182161790915560038054939094169216919091179091556002556100ce565b80516001600160a01b038116811461008d57600080fd5b919050565b6000806000606084860312156100a757600080fd5b6100b084610076565b92506100be60208501610076565b9150604084015190509250925092565b61281e80620000de6000396000f3fe60806040523480156200001157600080fd5b5060043610620000ff5760003560e01c8063880cdc31116200009e578063880cdc3114620002015780638da5cb5b14620002185780639f36b816146200022c578063a5aca3801462000243578063c7bbe4dc146200025a578063cd98536b146200028e578063e01ee41214620002c7578063f95f152114620002f5578063fc80ade3146200030c57600080fd5b8063117a05d514620001045780631ead7deb146200011d578063336c7308146200013457806335b444f014620001515780634f1e404f146200015b5780635251e81c14620001835780636a59c3d4146200019a5780637743b6d314620001d5575b600080fd5b6200011b62000115366004620013c7565b62000320565b005b6200011b6200012e366004620012cc565b62000644565b6200013e60025481565b6040519081526020015b60405180910390f35b6200013e60015481565b620001726200016c366004620012cc565b62000676565b604051901515815260200162000148565b6200013e620001943660046200137a565b620007cb565b620001c6620001ab366004620012cc565b6000908152600760205260409020546001600160a01b031690565b60405162000148919062001439565b620001c6620001e6366004620012cc565b6007602052600090815260409020546001600160a01b031681565b6200011b6200021236600462001214565b620009f5565b600054620001c6906001600160a01b031681565b6200011b6200023d366004620013c7565b62000a8b565b6200011b6200025436600462001300565b62000e34565b6200013e6200026b36600462001333565b600660209081526000938452604080852082529284528284209052825290205481565b6200013e6200029f36600462001300565b60009182526005602090815260408084206001600160a01b0393909316845291905290205490565b6200013e620002d836600462001300565b600560209081526000928352604080842090915290825290205481565b620001c66200030636600462001416565b620011aa565b600354620001c6906001600160a01b031681565b6000546001600160a01b03163314620003565760405162461bcd60e51b81526004016200034d906200144d565b60405180910390fd5b6003546040516323b872dd60e01b81526001600160a01b03838116600483015230602483015260448201859052909116906323b872dd90606401602060405180830381600087803b158015620003ab57600080fd5b505af1158015620003c0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003e6919062001234565b620004055760405162461bcd60e51b81526004016200034d9062001484565b60008481526005602090815260408083206001600160a01b0387168452909152902054620004348184620011e3565b9050600154811015620004a45760405162461bcd60e51b815260206004820152603160248201527f73686f756c64206d65657420746865206d696e20636f6c6c61746572616c20616044820152701b5bdd5b9d081c995c5d5a5c995b595b9d607a1b60648201526084016200034d565b60008581526005602090815260408083206001600160a01b03808916808652918452828520869055898552600684528285209185529083528184209086168452909152902054620004f68185620011e3565b60008781526006602090815260408083206001600160a01b03808b16855290835281842090881684529091528120829055909150805b600088815260046020526040902054811015620005ad57600088815260046020526040902080546001600160a01b03891691908390811062000572576200057262001520565b6000918252602090912001546001600160a01b03161415620005985760019150620005ad565b80620005a481620014ec565b9150506200052c565b5080620005ec5760008781526004602090815260408220805460018101825590835291200180546001600160a01b0319166001600160a01b0388161790555b836001600160a01b0316866001600160a01b0316887fdbce15b4f4d15cbcc2418b64edca721f02bc1014480d42eef77fa18e06564c4d886040516200063391815260200190565b60405180910390a450505050505050565b6000546001600160a01b03163314620006715760405162461bcd60e51b81526004016200034d906200144d565b600155565b6000805b6000838152600460205260409020548110156200070c576000838152600460205260408120805483908110620006b457620006b462001520565b60009182526020808320909101548683526005825260408084206001600160a01b039092168085529190925291205490915015620006f6575060019392505050565b50806200070381620014ec565b9150506200067a565b506000828152600760205260409020546001600160a01b031615620007c357600082815260076020908152604091829020548251631a07f9c360e21b815292516001600160a01b039091169263681fe70c926004808301939192829003018186803b1580156200077b57600080fd5b505afa15801562000790573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007b6919062001234565b620007c357506001919050565b506000919050565b600080546001600160a01b03163314620007f95760405162461bcd60e51b81526004016200034d906200144d565b5060008481526006602090815260408083206001600160a01b03808816855290835281842090861684529091528120548280821015620008365750805b620008428282620011f8565b60008881526006602090815260408083206001600160a01b03808c16808652918452828520908b1685528352818420949094558a8352600582528083209383529290522054620008939082620011f8565b60008881526005602090815260408083206001600160a01b038b168452909152902055620008c28382620011e3565b9250846001600160a01b0316877f3f274b47575a0be275b10dad94a97d6b883fd9cb697f82c1911aef6ad9ad3a1b836040516200090191815260200190565b60405180910390a383821015620009eb576000620009208583620011f8565b6000898152600760205260409020549091506001600160a01b031615620009e9576000888152600760205260408082205490516302fb4d8560e01b81526001600160a01b03898116600483015260248201859052909116906302fb4d8590604401602060405180830381600087803b1580156200099c57600080fd5b505af1158015620009b1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620009d79190620012e6565b9050620009e58582620011e3565b9450505b505b5050949350505050565b6000546001600160a01b0316331462000a225760405162461bcd60e51b81526004016200034d906200144d565b600054604080516001600160a01b03928316815291831660208301527fe2c7d1c4da37855e682bde14f17826d185497973b73fba7554daa6da467058d9910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331462000ab85760405162461bcd60e51b81526004016200034d906200144d565b60008481526005602090815260408083206001600160a01b03871684529091529020548281101562000b465760405162461bcd60e51b815260206004820152603060248201527f6e6f7420656e6f75676820636f6c6c61746572616c2072656d61696e6564206660448201526f37b9103a3432903b30b634b230ba37b960811b60648201526084016200034d565b62000b528184620011f8565b905080158062000b6457506001548110155b62000bbe5760405162461bcd60e51b8152602060048201526024808201527f696e76616c696420636f6c6c61746572616c207769746864726177616c20616d6044820152631bdd5b9d60e21b60648201526084016200034d565b60008581526005602090815260408083206001600160a01b038089168086529184528285208690558985526006845282852091855290835281842090861684529091529020548381101562000c8a5760405162461bcd60e51b8152602060048201526044602482018190527f67756172616e746f7227732072656d61696e696e6720636f6c6c61746572616c908201527f206973206c6f776572207468616e20746865207769746864726177616c20616d6064820152631bdd5b9d60e21b608482015260a4016200034d565b62000c968185620011f8565b60008781526006602090815260408083206001600160a01b03808b168552908352818420888216855283528184208590558a84526007909252909120549192501662000d5d576003546040516001600160a01b0390911690309062000cfb9062001206565b6001600160a01b03928316815291166020820152604001604051809103906000f08015801562000d2f573d6000803e3d6000fd5b50600087815260076020526040902080546001600160a01b0319166001600160a01b03929092169190911790555b60006002544362000d6f9190620014b7565b60008881526007602052604090819020549051639b939b2160e01b81526001600160a01b0387811660048301526024820189905260448201849052929350911690639b939b2190606401600060405180830381600087803b15801562000dd457600080fd5b505af115801562000de9573d6000803e3d6000fd5b50505050836001600160a01b0316866001600160a01b0316887ff049ce4b58effbdd85cc8fbcf48a4e549f4a53a2a9b90bb49b95b97ddce36af1886040516200063391815260200190565b6000546001600160a01b0316331462000e615760405162461bcd60e51b81526004016200034d906200144d565b6000828152600760205260409020546001600160a01b031662000f135760405162461bcd60e51b815260206004820152605c60248201527f746865207769746864726177616c20717565756520646f6573206e6f7420657860448201527f69737420666f722074686520737562636861696e2c2068617320616e7920636f60648201527f6c6c61746572616c206265656e2077697468647261776e207965743f00000000608482015260a4016200034d565b6000828152600760205260409081902054905163619172b760e01b81526001600160a01b039091169063619172b79062000f5290849060040162001439565b60606040518083038186803b15801562000f6b57600080fd5b505afa15801562000f80573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000fa6919062001258565b604001514310156200101a5760405162461bcd60e51b815260206004820152603660248201527f6e6f20636f6c6c61746572616c20697320726561647920746f20626520636c6160448201527534b6b2b2103337b9103a34329033bab0b930b73a37b960511b60648201526084016200034d565b6000828152600760205260408082205490516302f1e63f60e31b81526001600160a01b039091169063178f31f8906200105890859060040162001439565b606060405180830381600087803b1580156200107357600080fd5b505af115801562001088573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620010ae919062001258565b602081015160035460405163a9059cbb60e01b81526001600160a01b038681166004830152602482018490529394509192169063a9059cbb90604401602060405180830381600087803b1580156200110557600080fd5b505af11580156200111a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001140919062001234565b6200115f5760405162461bcd60e51b81526004016200034d9062001484565b826001600160a01b0316847f063f3c865515831cbc40ae0338f1e8af83465a52dc7b18cb7847587f9ea1cf4e836040516200119c91815260200190565b60405180910390a350505050565b60046020528160005260406000208181548110620011c757600080fd5b6000918252602090912001546001600160a01b03169150829050565b6000620011f18284620014b7565b9392505050565b6000620011f18284620014d2565b611299806200155083390190565b6000602082840312156200122757600080fd5b8135620011f18162001536565b6000602082840312156200124757600080fd5b81518015158114620011f157600080fd5b6000606082840312156200126b57600080fd5b6040516060810181811067ffffffffffffffff821117156200129d57634e487b7160e01b600052604160045260246000fd5b6040528251620012ad8162001536565b8152602083810151908201526040928301519281019290925250919050565b600060208284031215620012df57600080fd5b5035919050565b600060208284031215620012f957600080fd5b5051919050565b600080604083850312156200131457600080fd5b823591506020830135620013288162001536565b809150509250929050565b6000806000606084860312156200134957600080fd5b8335925060208401356200135d8162001536565b915060408401356200136f8162001536565b809150509250925092565b600080600080608085870312156200139157600080fd5b843593506020850135620013a58162001536565b92506040850135620013b78162001536565b9396929550929360600135925050565b60008060008060808587031215620013de57600080fd5b843593506020850135620013f28162001536565b92506040850135915060608501356200140b8162001536565b939692955090935050565b600080604083850312156200142a57600080fd5b50508035926020909101359150565b6001600160a01b0391909116815260200190565b6020808252601c908201527f6f6e6c79206f776e65722063616e206d616b65207468652063616c6c00000000604082015260600190565b6020808252601990820152786661696c656420746f207472616e736665722077544845544160381b604082015260600190565b60008219821115620014cd57620014cd6200150a565b500190565b600082821015620014e757620014e76200150a565b500390565b60006000198214156200150357620015036200150a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03811681146200154c57600080fd5b5056fe608060405234801561001057600080fd5b5060405161129938038061129983398101604081905261002f91610158565b600080546001600160a01b0319166001600160a01b038381169190911790915582166100b15760405162461bcd60e51b815260206004820152602660248201527f696e76616c696420746f6b656e20666f7220746865207769746864726177616c60448201526520717565756560d01b60648201526084015b60405180910390fd5b6001600160a01b0381166101165760405162461bcd60e51b815260206004820152602660248201527f696e76616c6964206f776e657220666f7220746865207769746864726177616c60448201526520717565756560d01b60648201526084016100a8565b50600180546001600160a01b0319166001600160a01b039290921691909117905561018b565b80516001600160a01b038116811461015357600080fd5b919050565b6000806040838503121561016b57600080fd5b6101748361013c565b91506101826020840161013c565b90509250929050565b6110ff8061019a6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80638a809767116100715780638a809767146101595780638da5cb5b1461016e5780639b939b2114610199578063bfd772fc146101ac578063efb166d0146101bf578063fc0c546a146101e157600080fd5b806302fb4d85146100b9578063178f31f8146100df578063619172b7146100ff578063681fe70c146101125780637d031b6514610124578063880cdc3114610144575b600080fd5b6100cc6100c7366004610eb0565b6101f4565b6040519081526020015b60405180910390f35b6100f26100ed366004610e95565b61053f565b6040516100d6919061102f565b6100f261010d366004610e95565b610985565b600354604051901581526020016100d6565b610137610132366004610e95565b610a8d565b6040516100d69190610fb6565b610157610152366004610e95565b610b23565b005b610161610bb6565b6040516100d69190610f69565b600054610181906001600160a01b031681565b6040516001600160a01b0390911681526020016100d6565b6101576101a7366004610eda565b610c18565b6101816101ba366004610f0d565b610d6a565b6101d26101cd366004610eb0565b610d94565b6040516100d693929190610f48565b600154610181906001600160a01b031681565b600080546001600160a01b031633146102285760405162461bcd60e51b815260040161021f90610ff8565b60405180910390fd5b506000805b6001600160a01b0384166000908152600260205260409020548110156105375760006102598484610de0565b6001600160a01b03861660009081526002602052604090208054919250829184908110610288576102886110b3565b906000526020600020906003020160010154116103f7576001600160a01b038516600090815260026020526040902080547f856403611d5b78b55440b0a08dbac9c93dd6ceb984ac669a8c6052460115b259918791859081106102ed576102ed6110b3565b90600052602060002090600302016001015460026000896001600160a01b03166001600160a01b031681526020019081526020016000208581548110610335576103356110b3565b90600052602060002090600302016002015460405161035693929190610f48565b60405180910390a16001600160a01b038516600090815260026020526040902080546103ae91908490811061038d5761038d6110b3565b90600052602060002090600302016001015484610df390919063ffffffff16565b6001600160a01b038616600090815260026020526040812080549295509091849081106103dd576103dd6110b3565b906000526020600020906003020160010181905550610524565b7f856403611d5b78b55440b0a08dbac9c93dd6ceb984ac669a8c6052460115b259858260026000896001600160a01b03166001600160a01b031681526020019081526020016000208581548110610450576104506110b3565b90600052602060002090600302016002015460405161047193929190610f48565b60405180910390a16104838382610df3565b92506104df8160026000886001600160a01b03166001600160a01b0316815260200190815260200160002084815481106104bf576104bf6110b3565b906000526020600020906003020160010154610de090919063ffffffff16565b6001600160a01b0386166000908152600260205260409020805484908110610509576105096110b3565b90600052602060002090600302016001018190555050610537565b508061052f8161106c565b91505061022d565b505b92915050565b610547610dff565b6000546001600160a01b031633146105715760405162461bcd60e51b815260040161021f90610ff8565b6001600160a01b0382166000908152600260205260409020546105f85760405162461bcd60e51b815260206004820152603960248201527f746865207769746864726177616c20717565756520666f72207468652072656360448201527865697665722073686f756c64206e6f7420626520656d70747960381b606482015260840161021f565b6003546000805b8282101561065957846001600160a01b031660038381548110610624576106246110b3565b6000918252602090912001546001600160a01b0316141561064757506001610659565b816106518161106c565b9250506105ff565b806106b85760405162461bcd60e51b815260206004820152602960248201527f6e6f206d61746368656420726563656976657220666f756e642c2063616e6e6f60448201526874206465717565756560b81b606482015260840161021f565b6001600160a01b0385166000908152600260205260408120805482906106e0576106e06110b3565b6000918252602080832060408051606081018252600390940290910180546001600160a01b031684526001810154928401929092526002909101549082015291505b6001600160a01b03871660009081526002602052604090205461074790600190611055565b811015610819576001600160a01b038716600090815260026020526040902061077182600161103d565b81548110610781576107816110b3565b906000526020600020906003020160026000896001600160a01b03166001600160a01b0316815260200190815260200160002082815481106107c5576107c56110b3565b60009182526020909120825460039092020180546001600160a01b0319166001600160a01b0390921691909117815560018083015490820155600291820154910155806108118161106c565b915050610722565b506001600160a01b03861660009081526002602052604090208054806108415761084161109d565b6000828152602080822060036000199094019384020180546001600160a01b0319168155600181018390556002908101839055929093556001600160a01b03891681529152604090205461097a576001600160a01b03861660009081526002602052604081206108b091610e29565b6108bb600185611055565b8310156109465760036108cf84600161103d565b815481106108df576108df6110b3565b600091825260209091200154600380546001600160a01b03909216918590811061090b5761090b6110b3565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558261093e8161106c565b9350506108b0565b60038054806109575761095761109d565b600082815260209020810160001990810180546001600160a01b03191690550190555b93505050505b919050565b61098d610dff565b6001600160a01b038216600090815260026020908152604080832080548251818502810185019093528083529192909190849084015b82821015610a18576000848152602090819020604080516060810182526003860290920180546001600160a01b03168352600180820154848601526002909101549183019190915290835290920191016109c3565b5050505090506000815111610a645760405162461bcd60e51b815260206004820152601260248201527174686520717565756520697320656d70747960701b604482015260640161021f565b600081600081518110610a7957610a796110b3565b602002602001015190508092505050919050565b6001600160a01b0381166000908152600260209081526040808320805482518185028101850190935280835260609493849084015b82821015610b17576000848152602090819020604080516060810182526003860290920180546001600160a01b0316835260018082015484860152600290910154918301919091529083529092019101610ac2565b50929695505050505050565b6000546001600160a01b03163314610b4d5760405162461bcd60e51b815260040161021f90610ff8565b600054604080516001600160a01b03928316815291831660208301527fe2c7d1c4da37855e682bde14f17826d185497973b73fba7554daa6da467058d9910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b60606003805480602002602001604051908101604052809291908181526020018280548015610c0e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610bf0575b5050505050905090565b6000546001600160a01b03163314610c425760405162461bcd60e51b815260040161021f90610ff8565b6001600160a01b03838116600081815260026020818152604080842081516060810183529586528583018981529186018881528154600180820184559287529386209651600390940290960180546001600160a01b03191693909716929092178655519085015591519290910191909155805b600354811015610d1257846001600160a01b031660038281548110610cdc57610cdc6110b3565b6000918252602090912001546001600160a01b03161415610d005760019150610d12565b80610d0a8161106c565b915050610cb5565b5080610d6457600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b0386161790555b50505050565b60038181548110610d7a57600080fd5b6000918252602090912001546001600160a01b0316905081565b60026020528160005260406000208181548110610db057600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b03909116935090915083565b6000610dec8284611055565b9392505050565b6000610dec828461103d565b604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b5080546000825560030290600052602060002090810190610e4a9190610e4d565b50565b5b80821115610e7a5780546001600160a01b03191681556000600182018190556002820155600301610e4e565b5090565b80356001600160a01b038116811461098057600080fd5b600060208284031215610ea757600080fd5b610dec82610e7e565b60008060408385031215610ec357600080fd5b610ecc83610e7e565b946020939093013593505050565b600080600060608486031215610eef57600080fd5b610ef884610e7e565b95602085013595506040909401359392505050565b600060208284031215610f1f57600080fd5b5035919050565b80516001600160a01b0316825260208082015190830152604090810151910152565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b81811015610faa5783516001600160a01b031683529284019291840191600101610f85565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610faa57610fe5838551610f26565b9284019260609290920191600101610fd2565b6020808252601c908201527f6f6e6c79206f776e65722063616e206d616b65207468652063616c6c00000000604082015260600190565b606081016105398284610f26565b6000821982111561105057611050611087565b500190565b60008282101561106757611067611087565b500390565b600060001982141561108057611080611087565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fdfea264697066735822122089099b71e7a1b2a4fc449ef91b398fc994c7885896ad3652abc130d268a4c70464736f6c63430008070033a26469706673582212208799ce080b7bea1a8313d3702daf856df185e785f92d868d114ee31392d8aebe64736f6c6343000807003360806040523480156200001157600080fd5b50604051620046ff380380620046ff83398101604081905262000034916200008c565b600080546001600160a01b039586166001600160a01b03199182161790915560019290925560025560038054929093169116179055620000d4565b80516001600160a01b03811681146200008757600080fd5b919050565b60008060008060808587031215620000a357600080fd5b620000ae856200006f565b9350620000be602086016200006f565b6040860151606090960151949790965092505050565b61461b80620000e46000396000f3fe60806040523480156200001157600080fd5b5060043610620001695760003560e01c80636a59c3d411620000d357806390e7e395116200008657806390e7e39514620003e5578063b49d964614620003fc578063b9d392841462000413578063c0cc5e89146200042a578063c4ff90851462000441578063e9ed30e0146200045857600080fd5b80636a59c3d4146200030b5780636b529ac41462000337578063746348ac146200036b5780637743b6d3146200038e578063880cdc3114620003ba5780638da5cb5b14620003d157600080fd5b80633f216374116200012c5780633f216374146200023357806343f27e45146200026257806344669c03146200028957806352a8042114620002b15780635484274714620002c857806367016090146200030157600080fd5b8063192e1574146200016e5780631af10d7d146200019a5780631ce9f8ae14620001ea578063331515bc1462000203578063336c73081462000229575b600080fd5b60035462000182906001600160a01b031681565b60405162000191919062002f6f565b60405180910390f35b620001db620001ab36600462002e48565b60009283526006602090815260408085206001600160a01b03948516865282528085209290931684525290205490565b60405190815260200162000191565b62000201620001fb36600462002e8f565b62000480565b005b6200021a6200021436600462002de1565b62000b61565b60405162000191919062003021565b620001db60025481565b6200024a6200024436600462002f01565b62000bc5565b60408051921515835260208301919091520162000191565b620002796200027336600462002ede565b62000cec565b6040516200019192919062002fbd565b620002a06200029a36600462002ede565b62000ef1565b604051620001919392919062003036565b620001db620002c236600462002e15565b6200121a565b620001db620002d936600462002e15565b60009182526008602090815260408084206001600160a01b0393909316845291905290205490565b620001db60015481565b620001826200031c36600462002de1565b6000908152600a60205260409020546001600160a01b031690565b620001db6200034836600462002e48565b600660209081526000938452604080852082529284528284209052825290205481565b620001db6200037c36600462002de1565b60009081526007602052604090205490565b620001826200039f36600462002de1565b600a602052600090815260409020546001600160a01b031681565b62000201620003cb36600462002964565b620014f1565b60005462000182906001600160a01b031681565b620001db620003f636600462002de1565b62001587565b620001db6200040d36600462002de1565b62001774565b620002016200042436600462002e8f565b620017b1565b620002016200043b36600462002e15565b6200213d565b620001db6200045236600462002ede565b62002556565b6200046f6200046936600462002964565b62002588565b604051901515815260200162000191565b6000546001600160a01b03163314620004b65760405162461bcd60e51b8152600401620004ad9062003179565b60405180910390fd5b6003546040516378154cf760e01b8152600481018690526000916001600160a01b0316906378154cf79060240160006040518083038186803b158015620004fc57600080fd5b505afa15801562000511573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200053b919081019062002c84565b90508060a00151620005615760405162461bcd60e51b8152600401620004ad9062003135565b6040808201516000878152600960205291909120546200058d5760008681526009602052604090204390555b6200059886620025cb565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190620005c990309060040162002f6f565b60206040518083038186803b158015620005e257600080fd5b505afa158015620005f7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200061d919062002dfb565b6040516323b872dd60e01b81526001600160a01b03868116600483015230602483015260448201889052919250908316906323b872dd90606401602060405180830381600087803b1580156200067257600080fd5b505af115801562000687573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006ad919062002b36565b620006cc5760405162461bcd60e51b8152600401620004ad90620030b9565b600087815260076020526040812054620006e8575084620007b8565b6040516390e7e39560e01b81526004810189905260009030906390e7e3959060240160206040518083038186803b1580156200072357600080fd5b505afa15801562000738573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200075e919062002dfb565b9050828110620007825760405162461bcd60e51b8152600401620004ad9062003105565b620007b462000792848362002810565b60008b815260076020526040902054620007ad908a62002825565b9062002833565b9150505b600088815260076020526040902054620007d3908262002841565b600089815260076020908152604080832093909355600881528282206001600160a01b0389168352905220546200080b908262002841565b60008981526008602090815260408083206001600160a01b038a1684529091528082209290925590516344669c0360e01b8152600481018a90524360248201819052919030906344669c039060440160006040518083038186803b1580156200087357600080fd5b505afa15801562000888573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620008b2919081019062002b54565b60008d8152600460209081526040808320888452909152812086905590935091508190505b82602001515181101562000a145760008360200151828151811062000900576200090062003307565b60200260200101516020015190508b6001600160a01b03168460200151838151811062000931576200093162003307565b6020026020010151600001516001600160a01b03161415620009605762000959818762002841565b9050600192505b600460008e81526020019081526020016000206000868152602001908152602001600020600101604051806040016040528086602001518581518110620009ab57620009ab62003307565b602090810291909101810151516001600160a01b03908116835291810194909452825460018082018555600094855293859020835160029092020180546001600160a01b031916919092161781559201519101558062000a0b81620032d3565b915050620008d7565b508062000a885760008b8152600460209081526040808320868452825280832081518083019092526001600160a01b038e81168352828401898152600192830180548085018255908752949095209251600290940290920180546001600160a01b0319169390921692909217815591519101555b50506000898152600560209081526040808320805460018101825590845282842001939093558a8252600681528282206001600160a01b03808c16845290825283832090891683529052205462000ae0818362002841565b60008a81526006602090815260408083206001600160a01b03808e16808652918452828520908c1680865293529281902084905551929350918b907fb4b56601301e6d487e3bc6a7911c4e20df2bced1a62f677faee5c20896b486419062000b4e9089908d90899062002f9c565b60405180910390a4505050505050505050565b60008181526005602090815260409182902080548351818402810184019094528084526060939283018282801562000bb957602002820191906000526020600020905b81548152602001906001019080831162000ba4575b50505050509050919050565b6040516343f27e4560e01b8152600481018490526024810183905260009081908190819030906343f27e459060440160006040518083038186803b15801562000c0d57600080fd5b505afa15801562000c22573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000c4c9190810190620029bc565b8151919350915060005b8181101562000cd857866001600160a01b031684828151811062000c7e5762000c7e62003307565b60200260200101516001600160a01b0316141562000cc357600183828151811062000cad5762000cad62003307565b6020026020010151955095505050505062000ce4565b8062000ccf81620032d3565b91505062000c56565b50600080945094505050505b935093915050565b60608060008362000d005750600062000d21565b60018460015462000d12919062003297565b62000d1e9190620032b9565b90505b6040516344669c0360e01b8152600481018690526024810182905260009030906344669c039060440160006040518083038186803b15801562000d6357600080fd5b505afa15801562000d78573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000da2919081019062002b54565b9250505060008160200151519050806001600160401b0381111562000dcb5762000dcb6200331d565b60405190808252806020026020018201604052801562000df5578160200160208202803683370190505b509450806001600160401b0381111562000e135762000e136200331d565b60405190808252806020026020018201604052801562000e3d578160200160208202803683370190505b50935060005b8181101562000ee65760008360200151828151811062000e675762000e6762003307565b60200260200101519050806000015187838151811062000e8b5762000e8b62003307565b60200260200101906001600160a01b031690816001600160a01b031681525050806020015186838151811062000ec55762000ec562003307565b6020908102919091010152508062000edd81620032d3565b91505062000e43565b505050509250929050565b60008062000f12604051806040016040528060008152602001606081525090565b6000858152600560205260409020805462000f3557600080935093505062001213565b8060008154811062000f4b5762000f4b62003307565b906000526020600020015485101562000f6c57600080935093505062001213565b8054600090829062000f8190600190620032b9565b8154811062000f945762000f9462003307565b906000526020600020015490508581116200105b57600087815260046020908152604080832084845282528083208151808301835281548152600182810180548551818802810188019096528086529196889694959394869486820194909392909184015b8282101562001043576000848152602090819020604080518082019091526002850290910180546001600160a01b0316825260019081015482840152908352909201910162000ff9565b50505050815250509050945094509450505062001213565b815460009081906200107090600190620032b9565b905083828154811062001087576200108762003307565b906000526020600020015495505b818111156200116d5760006002620010ae8484620032b9565b620010ba919062003274565b620010c69083620032b9565b90506000858281548110620010df57620010df62003307565b9060005260206000200154905089811415620010ff5796506200116d9050565b89811015620011335781935085848154811062001120576200112062003307565b9060005260206000200154975062001165565b62001140600183620032b9565b925085848154811062001157576200115762003307565b906000526020600020015497505b505062001095565b6000898152600460209081526040808320898452825280832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101562001200576000848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101620011b6565b5050505081525050945060019650505050505b9250925092565b6000828152600760205260408120546200123757506000620014eb565b6003546040516378154cf760e01b8152600481018590526000916001600160a01b0316906378154cf79060240160006040518083038186803b1580156200127d57600080fd5b505afa15801562001292573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620012bc919081019062002c84565b6040808201516000878152600960205291822054929350914391908083106200136e576200136b620012ef848362002810565b856001600160a01b03166324e770d06040518163ffffffff1660e01b815260040160206040518083038186803b1580156200132957600080fd5b505afa1580156200133e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001364919062002dfb565b9062002825565b91505b60008881526008602090815260408083206001600160a01b03808c16855292528083205490516370a0823160e01b81529092916200141c9186918916906370a0823190620013c190309060040162002f6f565b60206040518083038186803b158015620013da57600080fd5b505afa158015620013ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001415919062002dfb565b9062002841565b6040516390e7e39560e01b8152600481018c905290915060009030906390e7e3959060240160206040518083038186803b1580156200145a57600080fd5b505afa1580156200146f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001495919062002dfb565b905081811115620014ba5760405162461bcd60e51b8152600401620004ad9062003105565b60008b815260076020526040812054620014df90620007ad8662001364878762002810565b99505050505050505050505b92915050565b6000546001600160a01b031633146200151e5760405162461bcd60e51b8152600401620004ad9062003179565b600054604080516001600160a01b03928316815291831660208301527fe2c7d1c4da37855e682bde14f17826d185497973b73fba7554daa6da467058d9910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600a60205260408120546001600160a01b0316620015ac57506000919050565b6000828152600a6020526040808220548151638a80976760e01b815291516001600160a01b039091169183918391638a8097679160048083019286929190829003018186803b158015620015ff57600080fd5b505afa15801562001614573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200163e919081019062002984565b905060005b81518110156200176a57600082828151811062001664576200166462003307565b602002602001015190506000846001600160a01b0316637d031b65836040518263ffffffff1660e01b81526004016200169e919062002f6f565b60006040518083038186803b158015620016b757600080fd5b505afa158015620016cc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620016f6919081019062002a89565b905060005b815181101562001751576200173a8282815181106200171e576200171e62003307565b602002602001015160200151886200284190919063ffffffff16565b9650806200174881620032d3565b915050620016fb565b50505080806200176190620032d3565b91505062001643565b5091949350505050565b6000806200178e600154846200283390919063ffffffff16565b90506000620017a9600154836200282590919063ffffffff16565b949350505050565b6000546001600160a01b03163314620017de5760405162461bcd60e51b8152600401620004ad9062003179565b60008211620018275760405162461bcd60e51b81526020600482015260146024820152731a5b9d985b1a59081cda185c9948185b5bdd5b9d60621b6044820152606401620004ad565b600084815260076020526040902054821115620018a85760405162461bcd60e51b815260206004820152603860248201527f74686520737562636861696e20646f6573206e6f7420686176652073756666696044820152776369656e742073686172657320746f20776974686472617760401b6064820152608401620004ad565b60008481526008602090815260408083206001600160a01b03851684529091529020548211156200193b5760405162461bcd60e51b815260206004820152603660248201527f746865207374616b657220646f6573206e6f7420686176652073756666696369604482015275656e742073686172657320746f20776974686472617760501b6064820152608401620004ad565b6200194684620025cb565b6003546040516378154cf760e01b8152600481018690526000916001600160a01b0316906378154cf79060240160006040518083038186803b1580156200198c57600080fd5b505afa158015620019a1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620019cb919081019062002c84565b60408082015190516370a0823160e01b8152919250906000906001600160a01b038316906370a082319062001a0590309060040162002f6f565b60206040518083038186803b15801562001a1e57600080fd5b505afa15801562001a33573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a59919062002dfb565b6040516390e7e39560e01b815260048101899052909150600090819030906390e7e3959060240160206040518083038186803b15801562001a9957600080fd5b505afa15801562001aae573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001ad4919062002dfb565b90508281111562001af95760405162461bcd60e51b8152600401620004ad9062003105565b60008981526007602052604090205462001b1e90620007ad8962001364878662002810565b60008a81526007602052604090205490925062001b3d91508762002810565b600089815260076020908152604080832093909355600881528282206001600160a01b03891683529052205462001b75908762002810565b60008981526008602090815260408083206001600160a01b038a1684529091528082209290925590516344669c0360e01b8152600481018a905243602482018190529190819030906344669c039060440160006040518083038186803b15801562001bdf57600080fd5b505afa15801562001bf4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262001c1e919081019062002b54565b92505091508162001c895760405162461bcd60e51b815260206004820152602e60248201527f6e6f207374616b6520736e617073686f742065786974732c2063616e6e6f742060448201526d7769746864726177207374616b6560901b6064820152608401620004ad565b60008b81526004602090815260408083208684529091528120849055805b82602001515181101562001e665760008360200151828151811062001cd05762001cd062003307565b60200260200101516020015190508c6001600160a01b03168460200151838151811062001d015762001d0162003307565b6020026020010151600001516001600160a01b0316141562001da8578b81101562001d955760405162461bcd60e51b815260206004820152603c60248201527f76616c696461746f7227732072656d61696e696e67207368617265206c6f776560448201527f72207468616e20746865207769746864726177616c20616d6f756e74000000006064820152608401620004ad565b62001da1818d62002810565b9050600192505b801562001e5057600460008f8152602001908152602001600020600087815260200190815260200160002060010160405180604001604052808660200151858151811062001dfa5762001dfa62003307565b602090810291909101810151516001600160a01b039081168352918101859052835460018082018655600095865294829020845160029092020180546001600160a01b0319169190931617825591909101519101555b508062001e5d81620032d3565b91505062001ca7565b508062001ec75760405162461bcd60e51b815260206004820152602860248201527f63616e6e6f7420756e7374616b652066726f6d2061206e6f6e2d76616c696461604482015267746f72206e6f646560c01b6064820152608401620004ad565b50505060008981526005602090815260408083208054600181018255908452828420439101558b8352600682528083206001600160a01b03808d168552908352818420908a16845290915290205490508681101562001f695760405162461bcd60e51b815260206004820152601a60248201527f6e6f7420656e6f7567682072656d61696e696e672073686172650000000000006044820152606401620004ad565b62001f75818862002810565b60008a81526006602090815260408083206001600160a01b03808e1685529083528184208b8216855283528184208590558d8452600a909252909120549192501662002051578460a0015162001fdf5760405162461bcd60e51b8152600401620004ad9062003135565b833060405162001fef906200284f565b6001600160a01b03928316815291166020820152604001604051809103906000f08015801562002023573d6000803e3d6000fd5b5060008a8152600a6020526040902080546001600160a01b0319166001600160a01b03929092169190911790555b60006002544362002063919062003259565b60008b8152600a602052604090819020549051639b939b2160e01b81529192506001600160a01b031690639b939b2190620020a7908a908790869060040162002f9c565b600060405180830381600087803b158015620020c257600080fd5b505af1158015620020d7573d6000803e3d6000fd5b50505050866001600160a01b0316896001600160a01b03168b7f6f9a3eaaf9b34fce3afb673b23786645846fee391ea3f9b8a2b2741bc0627fe28960400151878d604051620021299392919062002f9c565b60405180910390a450505050505050505050565b6000546001600160a01b031633146200216a5760405162461bcd60e51b8152600401620004ad9062003179565b6000828152600a60205260409020546001600160a01b0316620022165760405162461bcd60e51b815260206004820152605760248201527f746865207769746864726177616c20717565756520646f6573206e6f7420657860448201527f69737420666f722074686520737562636861696e2c2068617320616e79207374606482015276616b65206265656e2077697468647261776e207965743f60481b608482015260a401620004ad565b6000828152600a60205260409081902054905163619172b760e01b81526001600160a01b039091169063619172b7906200225590849060040162002f6f565b60606040518083038186803b1580156200226e57600080fd5b505afa15801562002283573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620022a9919062002dc2565b60400151431015620023155760405162461bcd60e51b815260206004820152602e60248201527f6e6f207374616b6520697320726561647920746f20626520636c61696d65642060448201526d3337b9103a34329039ba30b5b2b960911b6064820152608401620004ad565b6000828152600a60205260408082205490516302f1e63f60e31b81526001600160a01b039091169063178f31f8906200235390859060040162002f6f565b606060405180830381600087803b1580156200236e57600080fd5b505af115801562002383573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620023a9919062002dc2565b60208101516003546040516378154cf760e01b81526004810187905292935090916000916001600160a01b0316906378154cf79060240160006040518083038186803b158015620023f957600080fd5b505afa1580156200240e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262002438919081019062002c84565b90508060a001516200245e5760405162461bcd60e51b8152600401620004ad9062003135565b604080820151905163a9059cbb60e01b81526001600160a01b0382169063a9059cbb9062002493908890879060040162002f83565b602060405180830381600087803b158015620024ae57600080fd5b505af1158015620024c3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620024e9919062002b36565b620025085760405162461bcd60e51b8152600401620004ad90620030b9565b846001600160a01b0316867ff2b7d7e64fef4a69e46e34e4d45de5951b9a9b2679adf7520d8bf6a16376692d83866040516200254692919062002f83565b60405180910390a3505050505050565b600560205281600052604060002081815481106200257357600080fd5b90600052602060002001600091509150505481565b6040805160048152602481019091526020810180516001600160e01b031663024e770d60e41b178152815160009283929091839182919082885af1949350505050565b600081815260096020526040902054438110620025e6575050565b6003546040516378154cf760e01b8152600481018490526000916001600160a01b0316906378154cf79060240160006040518083038186803b1580156200262c57600080fd5b505afa15801562002641573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200266b919081019062002c84565b90508060a00151620026915760405162461bcd60e51b8152600401620004ad9062003135565b604080820151905163074f698760e51b8152309063e9ed30e090620026bb90849060040162002f6f565b602060405180830381600087803b158015620026d657600080fd5b505af1158015620026eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002711919062002b36565b6200271c5750505050565b60006200272a438562002810565b905060006200276d82846001600160a01b03166324e770d06040518163ffffffff1660e01b815260040160206040518083038186803b1580156200132957600080fd5b600087815260096020526040908190204390555163ab8e786f60e01b81529091506001600160a01b0384169063ab8e786f90620027b1903090859060040162002f83565b602060405180830381600087803b158015620027cc57600080fd5b505af1158015620027e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002807919062002b36565b50505050505050565b60006200281e8284620032b9565b9392505050565b60006200281e828462003297565b60006200281e828462003274565b60006200281e828462003259565b611299806200334d83390190565b600082601f8301126200286f57600080fd5b8151602062002888620028828362003233565b62003200565b80838252828201915082860187848660051b8901011115620028a957600080fd5b60005b85811015620028d5578151620028c28162003333565b84529284019290840190600101620028ac565b5090979650505050505050565b80518015158114620028f357600080fd5b919050565b6000606082840312156200290b57600080fd5b604051606081018181106001600160401b03821117156200293057620029306200331d565b80604052508091508251620029458162003333565b8082525060208301516020820152604083015160408201525092915050565b6000602082840312156200297757600080fd5b81356200281e8162003333565b6000602082840312156200299757600080fd5b81516001600160401b03811115620029ae57600080fd5b620017a9848285016200285d565b60008060408385031215620029d057600080fd5b82516001600160401b0380821115620029e857600080fd5b620029f6868387016200285d565b935060209150818501518181111562002a0e57600080fd5b85019050601f8101861362002a2257600080fd5b805162002a33620028828262003233565b80828252848201915084840189868560051b870101111562002a5457600080fd5b600094505b8385101562002a7957805183526001949094019391850191850162002a59565b5080955050505050509250929050565b6000602080838503121562002a9d57600080fd5b82516001600160401b0381111562002ab457600080fd5b8301601f8101851362002ac657600080fd5b805162002ad7620028828262003233565b818152838101908385016060808502860187018a101562002af757600080fd5b600095505b8486101562002b285762002b118a83620028f8565b845260019590950194928601929081019062002afc565b509098975050505050505050565b60006020828403121562002b4957600080fd5b6200281e82620028e2565b60008060006060848603121562002b6a57600080fd5b62002b7584620028e2565b925060208085015192506040808601516001600160401b038082111562002b9b57600080fd5b818801915082828a03121562002bb057600080fd5b62002bba620031b0565b82518152848301518281111562002bd057600080fd5b80840193505089601f84011262002be657600080fd5b8251915062002bf9620028828362003233565b8083825286820191508685018c888660061b880101111562002c1a57600080fd5b60009550855b8581101562002c6c5787828f03121562002c38578687fd5b62002c42620031b0565b825162002c4f8162003333565b8152828a01518a8201528452928801929087019060010162002c20565b50508087840152505080955050505050509250925092565b6000602080838503121562002c9857600080fd5b82516001600160401b038082111562002cb057600080fd5b9084019060c0828703121562002cc557600080fd5b62002ccf620031db565b825162002cdc8162003333565b81528284015184820152604083015162002cf68162003333565b604082015260608301518281111562002d0e57600080fd5b8301601f8101881362002d2057600080fd5b80518381111562002d355762002d356200331d565b62002d49601f8201601f1916870162003200565b9350808452888682840101111562002d6057600080fd5b60005b8181101562002d8057828101870151858201880152860162002d63565b8181111562002d925760008783870101525b5050508160608201526080830151608082015262002db360a08401620028e2565b60a08201529695505050505050565b60006060828403121562002dd557600080fd5b6200281e8383620028f8565b60006020828403121562002df457600080fd5b5035919050565b60006020828403121562002e0e57600080fd5b5051919050565b6000806040838503121562002e2957600080fd5b82359150602083013562002e3d8162003333565b809150509250929050565b60008060006060848603121562002e5e57600080fd5b83359250602084013562002e728162003333565b9150604084013562002e848162003333565b809150509250925092565b6000806000806080858703121562002ea657600080fd5b84359350602085013562002eba8162003333565b925060408501359150606085013562002ed38162003333565b939692955090935050565b6000806040838503121562002ef257600080fd5b50508035926020909101359150565b60008060006060848603121562002f1757600080fd5b8335925060208401359150604084013562002e848162003333565b600081518084526020808501945080840160005b8381101562002f645781518752958201959082019060010162002f46565b509495945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b604080825283519082018190526000906020906060840190828701845b82811015620030015781516001600160a01b03168452928401929084019060010162002fda565b5050508381038285015262003017818662002f32565b9695505050505050565b6020815260006200281e602083018462002f32565b8315158152600060208481840152604060608185015260a08401855160608601528286015182608087015281815180845260c0880191508583019350600092505b80831015620030ab57835180516001600160a01b031683528601518683015292850192600192909201919084019062003077565b509998505050505050505050565b6020808252602c908201527f6661696c656420746f207472616e7366657220737562636861696e20676f766560408201526b393730b731b2903a37b5b2b760a11b606082015260800190565b6020808252601690820152751a5b9d985b1a59081c195b991a5b99c8185b5bdd5b9d60521b604082015260600190565b60208082526024908201527f74686520737562636861696e4944206973206e6f742072656769737465726564604082015263081e595d60e21b606082015260800190565b6020808252601c908201527f6f6e6c79206f776e65722063616e206d616b65207468652063616c6c00000000604082015260600190565b604080519081016001600160401b0381118282101715620031d557620031d56200331d565b60405290565b60405160c081016001600160401b0381118282101715620031d557620031d56200331d565b604051601f8201601f191681016001600160401b03811182821017156200322b576200322b6200331d565b604052919050565b60006001600160401b038211156200324f576200324f6200331d565b5060051b60200190565b600082198211156200326f576200326f620032f1565b500190565b6000826200329257634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615620032b457620032b4620032f1565b500290565b600082821015620032ce57620032ce620032f1565b500390565b6000600019821415620032ea57620032ea620032f1565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200334957600080fd5b5056fe608060405234801561001057600080fd5b5060405161129938038061129983398101604081905261002f91610158565b600080546001600160a01b0319166001600160a01b038381169190911790915582166100b15760405162461bcd60e51b815260206004820152602660248201527f696e76616c696420746f6b656e20666f7220746865207769746864726177616c60448201526520717565756560d01b60648201526084015b60405180910390fd5b6001600160a01b0381166101165760405162461bcd60e51b815260206004820152602660248201527f696e76616c6964206f776e657220666f7220746865207769746864726177616c60448201526520717565756560d01b60648201526084016100a8565b50600180546001600160a01b0319166001600160a01b039290921691909117905561018b565b80516001600160a01b038116811461015357600080fd5b919050565b6000806040838503121561016b57600080fd5b6101748361013c565b91506101826020840161013c565b90509250929050565b6110ff8061019a6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80638a809767116100715780638a809767146101595780638da5cb5b1461016e5780639b939b2114610199578063bfd772fc146101ac578063efb166d0146101bf578063fc0c546a146101e157600080fd5b806302fb4d85146100b9578063178f31f8146100df578063619172b7146100ff578063681fe70c146101125780637d031b6514610124578063880cdc3114610144575b600080fd5b6100cc6100c7366004610eb0565b6101f4565b6040519081526020015b60405180910390f35b6100f26100ed366004610e95565b61053f565b6040516100d6919061102f565b6100f261010d366004610e95565b610985565b600354604051901581526020016100d6565b610137610132366004610e95565b610a8d565b6040516100d69190610fb6565b610157610152366004610e95565b610b23565b005b610161610bb6565b6040516100d69190610f69565b600054610181906001600160a01b031681565b6040516001600160a01b0390911681526020016100d6565b6101576101a7366004610eda565b610c18565b6101816101ba366004610f0d565b610d6a565b6101d26101cd366004610eb0565b610d94565b6040516100d693929190610f48565b600154610181906001600160a01b031681565b600080546001600160a01b031633146102285760405162461bcd60e51b815260040161021f90610ff8565b60405180910390fd5b506000805b6001600160a01b0384166000908152600260205260409020548110156105375760006102598484610de0565b6001600160a01b03861660009081526002602052604090208054919250829184908110610288576102886110b3565b906000526020600020906003020160010154116103f7576001600160a01b038516600090815260026020526040902080547f856403611d5b78b55440b0a08dbac9c93dd6ceb984ac669a8c6052460115b259918791859081106102ed576102ed6110b3565b90600052602060002090600302016001015460026000896001600160a01b03166001600160a01b031681526020019081526020016000208581548110610335576103356110b3565b90600052602060002090600302016002015460405161035693929190610f48565b60405180910390a16001600160a01b038516600090815260026020526040902080546103ae91908490811061038d5761038d6110b3565b90600052602060002090600302016001015484610df390919063ffffffff16565b6001600160a01b038616600090815260026020526040812080549295509091849081106103dd576103dd6110b3565b906000526020600020906003020160010181905550610524565b7f856403611d5b78b55440b0a08dbac9c93dd6ceb984ac669a8c6052460115b259858260026000896001600160a01b03166001600160a01b031681526020019081526020016000208581548110610450576104506110b3565b90600052602060002090600302016002015460405161047193929190610f48565b60405180910390a16104838382610df3565b92506104df8160026000886001600160a01b03166001600160a01b0316815260200190815260200160002084815481106104bf576104bf6110b3565b906000526020600020906003020160010154610de090919063ffffffff16565b6001600160a01b0386166000908152600260205260409020805484908110610509576105096110b3565b90600052602060002090600302016001018190555050610537565b508061052f8161106c565b91505061022d565b505b92915050565b610547610dff565b6000546001600160a01b031633146105715760405162461bcd60e51b815260040161021f90610ff8565b6001600160a01b0382166000908152600260205260409020546105f85760405162461bcd60e51b815260206004820152603960248201527f746865207769746864726177616c20717565756520666f72207468652072656360448201527865697665722073686f756c64206e6f7420626520656d70747960381b606482015260840161021f565b6003546000805b8282101561065957846001600160a01b031660038381548110610624576106246110b3565b6000918252602090912001546001600160a01b0316141561064757506001610659565b816106518161106c565b9250506105ff565b806106b85760405162461bcd60e51b815260206004820152602960248201527f6e6f206d61746368656420726563656976657220666f756e642c2063616e6e6f60448201526874206465717565756560b81b606482015260840161021f565b6001600160a01b0385166000908152600260205260408120805482906106e0576106e06110b3565b6000918252602080832060408051606081018252600390940290910180546001600160a01b031684526001810154928401929092526002909101549082015291505b6001600160a01b03871660009081526002602052604090205461074790600190611055565b811015610819576001600160a01b038716600090815260026020526040902061077182600161103d565b81548110610781576107816110b3565b906000526020600020906003020160026000896001600160a01b03166001600160a01b0316815260200190815260200160002082815481106107c5576107c56110b3565b60009182526020909120825460039092020180546001600160a01b0319166001600160a01b0390921691909117815560018083015490820155600291820154910155806108118161106c565b915050610722565b506001600160a01b03861660009081526002602052604090208054806108415761084161109d565b6000828152602080822060036000199094019384020180546001600160a01b0319168155600181018390556002908101839055929093556001600160a01b03891681529152604090205461097a576001600160a01b03861660009081526002602052604081206108b091610e29565b6108bb600185611055565b8310156109465760036108cf84600161103d565b815481106108df576108df6110b3565b600091825260209091200154600380546001600160a01b03909216918590811061090b5761090b6110b3565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558261093e8161106c565b9350506108b0565b60038054806109575761095761109d565b600082815260209020810160001990810180546001600160a01b03191690550190555b93505050505b919050565b61098d610dff565b6001600160a01b038216600090815260026020908152604080832080548251818502810185019093528083529192909190849084015b82821015610a18576000848152602090819020604080516060810182526003860290920180546001600160a01b03168352600180820154848601526002909101549183019190915290835290920191016109c3565b5050505090506000815111610a645760405162461bcd60e51b815260206004820152601260248201527174686520717565756520697320656d70747960701b604482015260640161021f565b600081600081518110610a7957610a796110b3565b602002602001015190508092505050919050565b6001600160a01b0381166000908152600260209081526040808320805482518185028101850190935280835260609493849084015b82821015610b17576000848152602090819020604080516060810182526003860290920180546001600160a01b0316835260018082015484860152600290910154918301919091529083529092019101610ac2565b50929695505050505050565b6000546001600160a01b03163314610b4d5760405162461bcd60e51b815260040161021f90610ff8565b600054604080516001600160a01b03928316815291831660208301527fe2c7d1c4da37855e682bde14f17826d185497973b73fba7554daa6da467058d9910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b60606003805480602002602001604051908101604052809291908181526020018280548015610c0e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610bf0575b5050505050905090565b6000546001600160a01b03163314610c425760405162461bcd60e51b815260040161021f90610ff8565b6001600160a01b03838116600081815260026020818152604080842081516060810183529586528583018981529186018881528154600180820184559287529386209651600390940290960180546001600160a01b03191693909716929092178655519085015591519290910191909155805b600354811015610d1257846001600160a01b031660038281548110610cdc57610cdc6110b3565b6000918252602090912001546001600160a01b03161415610d005760019150610d12565b80610d0a8161106c565b915050610cb5565b5080610d6457600380546001810182556000919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b0386161790555b50505050565b60038181548110610d7a57600080fd5b6000918252602090912001546001600160a01b0316905081565b60026020528160005260406000208181548110610db057600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b03909116935090915083565b6000610dec8284611055565b9392505050565b6000610dec828461103d565b604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b5080546000825560030290600052602060002090810190610e4a9190610e4d565b50565b5b80821115610e7a5780546001600160a01b03191681556000600182018190556002820155600301610e4e565b5090565b80356001600160a01b038116811461098057600080fd5b600060208284031215610ea757600080fd5b610dec82610e7e565b60008060408385031215610ec357600080fd5b610ecc83610e7e565b946020939093013593505050565b600080600060608486031215610eef57600080fd5b610ef884610e7e565b95602085013595506040909401359392505050565b600060208284031215610f1f57600080fd5b5035919050565b80516001600160a01b0316825260208082015190830152604090810151910152565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b81811015610faa5783516001600160a01b031683529284019291840191600101610f85565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610faa57610fe5838551610f26565b9284019260609290920191600101610fd2565b6020808252601c908201527f6f6e6c79206f776e65722063616e206d616b65207468652063616c6c00000000604082015260600190565b606081016105398284610f26565b6000821982111561105057611050611087565b500190565b60008282101561106757611067611087565b500390565b600060001982141561108057611080611087565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fdfea264697066735822122089099b71e7a1b2a4fc449ef91b398fc994c7885896ad3652abc130d268a4c70464736f6c63430008070033a2646970667358221220e92d8b6c918e0b82281fd2073c0c0440628a2d118bd44a8d48aaa64891126e2464736f6c63430008070033",
}

// ChainRegistrarOnMainchainABI is the input ABI used to generate the binding from.
// Deprecated: Use ChainRegistrarOnMainchainMetaData.ABI instead.
var ChainRegistrarOnMainchainABI = ChainRegistrarOnMainchainMetaData.ABI

// ChainRegistrarOnMainchainBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use ChainRegistrarOnMainchainMetaData.Bin instead.
var ChainRegistrarOnMainchainBin = ChainRegistrarOnMainchainMetaData.Bin

// DeployChainRegistrarOnMainchain deploys a new Ethereum contract, binding an instance of ChainRegistrarOnMainchain to it.
func DeployChainRegistrarOnMainchain(auth *bind.TransactOpts, backend bind.ContractBackend, wTheta_ common.Address, superAdmin_ common.Address, admin_ common.Address, governor_ common.Address, numBlocksPerDynasty_ *big.Int, withdrawalPendingPeriodInBlocks_ *big.Int, crossChainFee_ *big.Int, initialFeeRequired_ *big.Int, fallbackReceiver_ common.Address) (common.Address, *types.Transaction, *ChainRegistrarOnMainchain, error) {
	parsed, err := ChainRegistrarOnMainchainMetaData.GetAbi()
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	if parsed == nil {
		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
	}

	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ChainRegistrarOnMainchainBin), backend, wTheta_, superAdmin_, admin_, governor_, numBlocksPerDynasty_, withdrawalPendingPeriodInBlocks_, crossChainFee_, initialFeeRequired_, fallbackReceiver_)
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	return address, tx, &ChainRegistrarOnMainchain{ChainRegistrarOnMainchainCaller: ChainRegistrarOnMainchainCaller{contract: contract}, ChainRegistrarOnMainchainTransactor: ChainRegistrarOnMainchainTransactor{contract: contract}, ChainRegistrarOnMainchainFilterer: ChainRegistrarOnMainchainFilterer{contract: contract}}, nil
}

// ChainRegistrarOnMainchain is an auto generated Go binding around an Ethereum contract.
type ChainRegistrarOnMainchain struct {
	ChainRegistrarOnMainchainCaller     // Read-only binding to the contract
	ChainRegistrarOnMainchainTransactor // Write-only binding to the contract
	ChainRegistrarOnMainchainFilterer   // Log filterer for contract events
}

// ChainRegistrarOnMainchainCaller is an auto generated read-only Go binding around an Ethereum contract.
type ChainRegistrarOnMainchainCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// ChainRegistrarOnMainchainTransactor is an auto generated write-only Go binding around an Ethereum contract.
type ChainRegistrarOnMainchainTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// ChainRegistrarOnMainchainFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type ChainRegistrarOnMainchainFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// ChainRegistrarOnMainchainSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type ChainRegistrarOnMainchainSession struct {
	Contract     *ChainRegistrarOnMainchain // Generic contract binding to set the session for
	CallOpts     bind.CallOpts              // Call options to use throughout this session
	TransactOpts bind.TransactOpts          // Transaction auth options to use throughout this session
}

// ChainRegistrarOnMainchainCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type ChainRegistrarOnMainchainCallerSession struct {
	Contract *ChainRegistrarOnMainchainCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                    // Call options to use throughout this session
}

// ChainRegistrarOnMainchainTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type ChainRegistrarOnMainchainTransactorSession struct {
	Contract     *ChainRegistrarOnMainchainTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                    // Transaction auth options to use throughout this session
}

// ChainRegistrarOnMainchainRaw is an auto generated low-level Go binding around an Ethereum contract.
type ChainRegistrarOnMainchainRaw struct {
	Contract *ChainRegistrarOnMainchain // Generic contract binding to access the raw methods on
}

// ChainRegistrarOnMainchainCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type ChainRegistrarOnMainchainCallerRaw struct {
	Contract *ChainRegistrarOnMainchainCaller // Generic read-only contract binding to access the raw methods on
}

// ChainRegistrarOnMainchainTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type ChainRegistrarOnMainchainTransactorRaw struct {
	Contract *ChainRegistrarOnMainchainTransactor // Generic write-only contract binding to access the raw methods on
}

// NewChainRegistrarOnMainchain creates a new instance of ChainRegistrarOnMainchain, bound to a specific deployed contract.
func NewChainRegistrarOnMainchain(address common.Address, backend bind.ContractBackend) (*ChainRegistrarOnMainchain, error) {
	contract, err := bindChainRegistrarOnMainchain(address, backend, backend, backend)
	if err != nil {
		return nil, err
	}
	return &ChainRegistrarOnMainchain{ChainRegistrarOnMainchainCaller: ChainRegistrarOnMainchainCaller{contract: contract}, ChainRegistrarOnMainchainTransactor: ChainRegistrarOnMainchainTransactor{contract: contract}, ChainRegistrarOnMainchainFilterer: ChainRegistrarOnMainchainFilterer{contract: contract}}, nil
}

// NewChainRegistrarOnMainchainCaller creates a new read-only instance of ChainRegistrarOnMainchain, bound to a specific deployed contract.
func NewChainRegistrarOnMainchainCaller(address common.Address, caller bind.ContractCaller) (*ChainRegistrarOnMainchainCaller, error) {
	contract, err := bindChainRegistrarOnMainchain(address, caller, nil, nil)
	if err != nil {
		return nil, err
	}
	return &ChainRegistrarOnMainchainCaller{contract: contract}, nil
}

// NewChainRegistrarOnMainchainTransactor creates a new write-only instance of ChainRegistrarOnMainchain, bound to a specific deployed contract.
func NewChainRegistrarOnMainchainTransactor(address common.Address, transactor bind.ContractTransactor) (*ChainRegistrarOnMainchainTransactor, error) {
	contract, err := bindChainRegistrarOnMainchain(address, nil, transactor, nil)
	if err != nil {
		return nil, err
	}
	return &ChainRegistrarOnMainchainTransactor{contract: contract}, nil
}

// NewChainRegistrarOnMainchainFilterer creates a new log filterer instance of ChainRegistrarOnMainchain, bound to a specific deployed contract.
func NewChainRegistrarOnMainchainFilterer(address common.Address, filterer bind.ContractFilterer) (*ChainRegistrarOnMainchainFilterer, error) {
	contract, err := bindChainRegistrarOnMainchain(address, nil, nil, filterer)
	if err != nil {
		return nil, err
	}
	return &ChainRegistrarOnMainchainFilterer{contract: contract}, nil
}

// bindChainRegistrarOnMainchain binds a generic wrapper to an already deployed contract.
func bindChainRegistrarOnMainchain(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
	parsed, err := abi.JSON(strings.NewReader(ChainRegistrarOnMainchainABI))
	if err != nil {
		return nil, err
	}
	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
}

// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _ChainRegistrarOnMainchain.Contract.ChainRegistrarOnMainchainCaller.contract.Call(opts, result, method, params...)
}

// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.ChainRegistrarOnMainchainTransactor.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.ChainRegistrarOnMainchainTransactor.contract.Transact(opts, method, params...)
}

// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _ChainRegistrarOnMainchain.Contract.contract.Call(opts, result, method, params...)
}

// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.contract.Transact(opts, method, params...)
}

// Admin is a free data retrieval call binding the contract method 0xf851a440.
//
// Solidity: function admin() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) Admin(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "admin")

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// Admin is a free data retrieval call binding the contract method 0xf851a440.
//
// Solidity: function admin() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) Admin() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.Admin(&_ChainRegistrarOnMainchain.CallOpts)
}

// Admin is a free data retrieval call binding the contract method 0xf851a440.
//
// Solidity: function admin() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) Admin() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.Admin(&_ChainRegistrarOnMainchain.CallOpts)
}

// CrossChainFee is a free data retrieval call binding the contract method 0x164d29f6.
//
// Solidity: function crossChainFee() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) CrossChainFee(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "crossChainFee")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// CrossChainFee is a free data retrieval call binding the contract method 0x164d29f6.
//
// Solidity: function crossChainFee() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) CrossChainFee() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.CrossChainFee(&_ChainRegistrarOnMainchain.CallOpts)
}

// CrossChainFee is a free data retrieval call binding the contract method 0x164d29f6.
//
// Solidity: function crossChainFee() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) CrossChainFee() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.CrossChainFee(&_ChainRegistrarOnMainchain.CallOpts)
}

// FallbackReceiver is a free data retrieval call binding the contract method 0xf2269521.
//
// Solidity: function fallbackReceiver() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) FallbackReceiver(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "fallbackReceiver")

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// FallbackReceiver is a free data retrieval call binding the contract method 0xf2269521.
//
// Solidity: function fallbackReceiver() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) FallbackReceiver() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.FallbackReceiver(&_ChainRegistrarOnMainchain.CallOpts)
}

// FallbackReceiver is a free data retrieval call binding the contract method 0xf2269521.
//
// Solidity: function fallbackReceiver() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) FallbackReceiver() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.FallbackReceiver(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetAllSubchainIDs is a free data retrieval call binding the contract method 0x13b38499.
//
// Solidity: function getAllSubchainIDs() view returns(uint256[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetAllSubchainIDs(opts *bind.CallOpts) ([]*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getAllSubchainIDs")

	if err != nil {
		return *new([]*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new([]*big.Int)).(*[]*big.Int)

	return out0, err

}

// GetAllSubchainIDs is a free data retrieval call binding the contract method 0x13b38499.
//
// Solidity: function getAllSubchainIDs() view returns(uint256[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetAllSubchainIDs() ([]*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetAllSubchainIDs(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetAllSubchainIDs is a free data retrieval call binding the contract method 0x13b38499.
//
// Solidity: function getAllSubchainIDs() view returns(uint256[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetAllSubchainIDs() ([]*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetAllSubchainIDs(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetCrossChainFee is a free data retrieval call binding the contract method 0x9bbb690a.
//
// Solidity: function getCrossChainFee() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetCrossChainFee(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getCrossChainFee")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// GetCrossChainFee is a free data retrieval call binding the contract method 0x9bbb690a.
//
// Solidity: function getCrossChainFee() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetCrossChainFee() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetCrossChainFee(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetCrossChainFee is a free data retrieval call binding the contract method 0x9bbb690a.
//
// Solidity: function getCrossChainFee() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetCrossChainFee() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetCrossChainFee(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetDynasty is a free data retrieval call binding the contract method 0xdba9de6b.
//
// Solidity: function getDynasty() view returns(uint256 dynasty, bool success)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetDynasty(opts *bind.CallOpts) (struct {
	Dynasty *big.Int
	Success bool
}, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getDynasty")

	outstruct := new(struct {
		Dynasty *big.Int
		Success bool
	})
	if err != nil {
		return *outstruct, err
	}

	outstruct.Dynasty = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
	outstruct.Success = *abi.ConvertType(out[1], new(bool)).(*bool)

	return *outstruct, err

}

// GetDynasty is a free data retrieval call binding the contract method 0xdba9de6b.
//
// Solidity: function getDynasty() view returns(uint256 dynasty, bool success)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetDynasty() (struct {
	Dynasty *big.Int
	Success bool
}, error) {
	return _ChainRegistrarOnMainchain.Contract.GetDynasty(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetDynasty is a free data retrieval call binding the contract method 0xdba9de6b.
//
// Solidity: function getDynasty() view returns(uint256 dynasty, bool success)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetDynasty() (struct {
	Dynasty *big.Int
	Success bool
}, error) {
	return _ChainRegistrarOnMainchain.Contract.GetDynasty(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetFallbackReceiver is a free data retrieval call binding the contract method 0xc2ae68f4.
//
// Solidity: function getFallbackReceiver() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetFallbackReceiver(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getFallbackReceiver")

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// GetFallbackReceiver is a free data retrieval call binding the contract method 0xc2ae68f4.
//
// Solidity: function getFallbackReceiver() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetFallbackReceiver() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.GetFallbackReceiver(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetFallbackReceiver is a free data retrieval call binding the contract method 0xc2ae68f4.
//
// Solidity: function getFallbackReceiver() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetFallbackReceiver() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.GetFallbackReceiver(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetNumBlocksPerDynasty is a free data retrieval call binding the contract method 0xa7464b12.
//
// Solidity: function getNumBlocksPerDynasty() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetNumBlocksPerDynasty(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getNumBlocksPerDynasty")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// GetNumBlocksPerDynasty is a free data retrieval call binding the contract method 0xa7464b12.
//
// Solidity: function getNumBlocksPerDynasty() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetNumBlocksPerDynasty() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetNumBlocksPerDynasty(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetNumBlocksPerDynasty is a free data retrieval call binding the contract method 0xa7464b12.
//
// Solidity: function getNumBlocksPerDynasty() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetNumBlocksPerDynasty() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetNumBlocksPerDynasty(&_ChainRegistrarOnMainchain.CallOpts)
}

// GetPendingStakeWithdrawals is a free data retrieval call binding the contract method 0x1be47778.
//
// Solidity: function getPendingStakeWithdrawals(uint256 subchainID, address staker) view returns((address,uint256,uint256)[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetPendingStakeWithdrawals(opts *bind.CallOpts, subchainID *big.Int, staker common.Address) ([]WithdrawalQueueWithdrawalRequest, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getPendingStakeWithdrawals", subchainID, staker)

	if err != nil {
		return *new([]WithdrawalQueueWithdrawalRequest), err
	}

	out0 := *abi.ConvertType(out[0], new([]WithdrawalQueueWithdrawalRequest)).(*[]WithdrawalQueueWithdrawalRequest)

	return out0, err

}

// GetPendingStakeWithdrawals is a free data retrieval call binding the contract method 0x1be47778.
//
// Solidity: function getPendingStakeWithdrawals(uint256 subchainID, address staker) view returns((address,uint256,uint256)[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetPendingStakeWithdrawals(subchainID *big.Int, staker common.Address) ([]WithdrawalQueueWithdrawalRequest, error) {
	return _ChainRegistrarOnMainchain.Contract.GetPendingStakeWithdrawals(&_ChainRegistrarOnMainchain.CallOpts, subchainID, staker)
}

// GetPendingStakeWithdrawals is a free data retrieval call binding the contract method 0x1be47778.
//
// Solidity: function getPendingStakeWithdrawals(uint256 subchainID, address staker) view returns((address,uint256,uint256)[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetPendingStakeWithdrawals(subchainID *big.Int, staker common.Address) ([]WithdrawalQueueWithdrawalRequest, error) {
	return _ChainRegistrarOnMainchain.Contract.GetPendingStakeWithdrawals(&_ChainRegistrarOnMainchain.CallOpts, subchainID, staker)
}

// GetPendingValidatorCollateralWithdrawals is a free data retrieval call binding the contract method 0x464fa557.
//
// Solidity: function getPendingValidatorCollateralWithdrawals(uint256 subchainID, address guarantor) view returns((address,uint256,uint256)[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetPendingValidatorCollateralWithdrawals(opts *bind.CallOpts, subchainID *big.Int, guarantor common.Address) ([]WithdrawalQueueWithdrawalRequest, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getPendingValidatorCollateralWithdrawals", subchainID, guarantor)

	if err != nil {
		return *new([]WithdrawalQueueWithdrawalRequest), err
	}

	out0 := *abi.ConvertType(out[0], new([]WithdrawalQueueWithdrawalRequest)).(*[]WithdrawalQueueWithdrawalRequest)

	return out0, err

}

// GetPendingValidatorCollateralWithdrawals is a free data retrieval call binding the contract method 0x464fa557.
//
// Solidity: function getPendingValidatorCollateralWithdrawals(uint256 subchainID, address guarantor) view returns((address,uint256,uint256)[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetPendingValidatorCollateralWithdrawals(subchainID *big.Int, guarantor common.Address) ([]WithdrawalQueueWithdrawalRequest, error) {
	return _ChainRegistrarOnMainchain.Contract.GetPendingValidatorCollateralWithdrawals(&_ChainRegistrarOnMainchain.CallOpts, subchainID, guarantor)
}

// GetPendingValidatorCollateralWithdrawals is a free data retrieval call binding the contract method 0x464fa557.
//
// Solidity: function getPendingValidatorCollateralWithdrawals(uint256 subchainID, address guarantor) view returns((address,uint256,uint256)[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetPendingValidatorCollateralWithdrawals(subchainID *big.Int, guarantor common.Address) ([]WithdrawalQueueWithdrawalRequest, error) {
	return _ChainRegistrarOnMainchain.Contract.GetPendingValidatorCollateralWithdrawals(&_ChainRegistrarOnMainchain.CallOpts, subchainID, guarantor)
}

// GetStakeSnapshot is a free data retrieval call binding the contract method 0x44669c03.
//
// Solidity: function getStakeSnapshot(uint256 subchainID, uint256 blockHeight) view returns(bool exists, uint256 targetSnapshotHeight, (uint256,(address,uint256)[]) targetStakeSnapshot)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetStakeSnapshot(opts *bind.CallOpts, subchainID *big.Int, blockHeight *big.Int) (struct {
	Exists               bool
	TargetSnapshotHeight *big.Int
	TargetStakeSnapshot  ValidatorStakeManagerStakeSnapshot
}, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getStakeSnapshot", subchainID, blockHeight)

	outstruct := new(struct {
		Exists               bool
		TargetSnapshotHeight *big.Int
		TargetStakeSnapshot  ValidatorStakeManagerStakeSnapshot
	})
	if err != nil {
		return *outstruct, err
	}

	outstruct.Exists = *abi.ConvertType(out[0], new(bool)).(*bool)
	outstruct.TargetSnapshotHeight = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)
	outstruct.TargetStakeSnapshot = *abi.ConvertType(out[2], new(ValidatorStakeManagerStakeSnapshot)).(*ValidatorStakeManagerStakeSnapshot)

	return *outstruct, err

}

// GetStakeSnapshot is a free data retrieval call binding the contract method 0x44669c03.
//
// Solidity: function getStakeSnapshot(uint256 subchainID, uint256 blockHeight) view returns(bool exists, uint256 targetSnapshotHeight, (uint256,(address,uint256)[]) targetStakeSnapshot)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetStakeSnapshot(subchainID *big.Int, blockHeight *big.Int) (struct {
	Exists               bool
	TargetSnapshotHeight *big.Int
	TargetStakeSnapshot  ValidatorStakeManagerStakeSnapshot
}, error) {
	return _ChainRegistrarOnMainchain.Contract.GetStakeSnapshot(&_ChainRegistrarOnMainchain.CallOpts, subchainID, blockHeight)
}

// GetStakeSnapshot is a free data retrieval call binding the contract method 0x44669c03.
//
// Solidity: function getStakeSnapshot(uint256 subchainID, uint256 blockHeight) view returns(bool exists, uint256 targetSnapshotHeight, (uint256,(address,uint256)[]) targetStakeSnapshot)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetStakeSnapshot(subchainID *big.Int, blockHeight *big.Int) (struct {
	Exists               bool
	TargetSnapshotHeight *big.Int
	TargetStakeSnapshot  ValidatorStakeManagerStakeSnapshot
}, error) {
	return _ChainRegistrarOnMainchain.Contract.GetStakeSnapshot(&_ChainRegistrarOnMainchain.CallOpts, subchainID, blockHeight)
}

// GetStakeSnapshotHeights is a free data retrieval call binding the contract method 0x331515bc.
//
// Solidity: function getStakeSnapshotHeights(uint256 subchainID) view returns(uint256[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetStakeSnapshotHeights(opts *bind.CallOpts, subchainID *big.Int) ([]*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getStakeSnapshotHeights", subchainID)

	if err != nil {
		return *new([]*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new([]*big.Int)).(*[]*big.Int)

	return out0, err

}

// GetStakeSnapshotHeights is a free data retrieval call binding the contract method 0x331515bc.
//
// Solidity: function getStakeSnapshotHeights(uint256 subchainID) view returns(uint256[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetStakeSnapshotHeights(subchainID *big.Int) ([]*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetStakeSnapshotHeights(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetStakeSnapshotHeights is a free data retrieval call binding the contract method 0x331515bc.
//
// Solidity: function getStakeSnapshotHeights(uint256 subchainID) view returns(uint256[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetStakeSnapshotHeights(subchainID *big.Int) ([]*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetStakeSnapshotHeights(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetStakersWithPendingWithdrawals is a free data retrieval call binding the contract method 0x7744f6d4.
//
// Solidity: function getStakersWithPendingWithdrawals(uint256 subchainID) view returns(address[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetStakersWithPendingWithdrawals(opts *bind.CallOpts, subchainID *big.Int) ([]common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getStakersWithPendingWithdrawals", subchainID)

	if err != nil {
		return *new([]common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address)

	return out0, err

}

// GetStakersWithPendingWithdrawals is a free data retrieval call binding the contract method 0x7744f6d4.
//
// Solidity: function getStakersWithPendingWithdrawals(uint256 subchainID) view returns(address[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetStakersWithPendingWithdrawals(subchainID *big.Int) ([]common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.GetStakersWithPendingWithdrawals(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetStakersWithPendingWithdrawals is a free data retrieval call binding the contract method 0x7744f6d4.
//
// Solidity: function getStakersWithPendingWithdrawals(uint256 subchainID) view returns(address[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetStakersWithPendingWithdrawals(subchainID *big.Int) ([]common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.GetStakersWithPendingWithdrawals(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetSubchainMetadata is a free data retrieval call binding the contract method 0x78154cf7.
//
// Solidity: function getSubchainMetadata(uint256 subchainID) view returns((address,uint256,address,string,uint256,bool))
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetSubchainMetadata(opts *bind.CallOpts, subchainID *big.Int) (ChainRegistrarOnMainchainSubchainMetadata, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getSubchainMetadata", subchainID)

	if err != nil {
		return *new(ChainRegistrarOnMainchainSubchainMetadata), err
	}

	out0 := *abi.ConvertType(out[0], new(ChainRegistrarOnMainchainSubchainMetadata)).(*ChainRegistrarOnMainchainSubchainMetadata)

	return out0, err

}

// GetSubchainMetadata is a free data retrieval call binding the contract method 0x78154cf7.
//
// Solidity: function getSubchainMetadata(uint256 subchainID) view returns((address,uint256,address,string,uint256,bool))
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetSubchainMetadata(subchainID *big.Int) (ChainRegistrarOnMainchainSubchainMetadata, error) {
	return _ChainRegistrarOnMainchain.Contract.GetSubchainMetadata(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetSubchainMetadata is a free data retrieval call binding the contract method 0x78154cf7.
//
// Solidity: function getSubchainMetadata(uint256 subchainID) view returns((address,uint256,address,string,uint256,bool))
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetSubchainMetadata(subchainID *big.Int) (ChainRegistrarOnMainchainSubchainMetadata, error) {
	return _ChainRegistrarOnMainchain.Contract.GetSubchainMetadata(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetSubchainRegistrationHeight is a free data retrieval call binding the contract method 0x2f2c13b5.
//
// Solidity: function getSubchainRegistrationHeight(uint256 subchainID) view returns(uint256, bool)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetSubchainRegistrationHeight(opts *bind.CallOpts, subchainID *big.Int) (*big.Int, bool, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getSubchainRegistrationHeight", subchainID)

	if err != nil {
		return *new(*big.Int), *new(bool), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
	out1 := *abi.ConvertType(out[1], new(bool)).(*bool)

	return out0, out1, err

}

// GetSubchainRegistrationHeight is a free data retrieval call binding the contract method 0x2f2c13b5.
//
// Solidity: function getSubchainRegistrationHeight(uint256 subchainID) view returns(uint256, bool)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetSubchainRegistrationHeight(subchainID *big.Int) (*big.Int, bool, error) {
	return _ChainRegistrarOnMainchain.Contract.GetSubchainRegistrationHeight(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetSubchainRegistrationHeight is a free data retrieval call binding the contract method 0x2f2c13b5.
//
// Solidity: function getSubchainRegistrationHeight(uint256 subchainID) view returns(uint256, bool)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetSubchainRegistrationHeight(subchainID *big.Int) (*big.Int, bool, error) {
	return _ChainRegistrarOnMainchain.Contract.GetSubchainRegistrationHeight(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetTotalValidatorShares is a free data retrieval call binding the contract method 0x7e0c6253.
//
// Solidity: function getTotalValidatorShares(uint256 subchainID, uint256 dynasty) view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetTotalValidatorShares(opts *bind.CallOpts, subchainID *big.Int, dynasty *big.Int) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getTotalValidatorShares", subchainID, dynasty)

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// GetTotalValidatorShares is a free data retrieval call binding the contract method 0x7e0c6253.
//
// Solidity: function getTotalValidatorShares(uint256 subchainID, uint256 dynasty) view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetTotalValidatorShares(subchainID *big.Int, dynasty *big.Int) (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetTotalValidatorShares(&_ChainRegistrarOnMainchain.CallOpts, subchainID, dynasty)
}

// GetTotalValidatorShares is a free data retrieval call binding the contract method 0x7e0c6253.
//
// Solidity: function getTotalValidatorShares(uint256 subchainID, uint256 dynasty) view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetTotalValidatorShares(subchainID *big.Int, dynasty *big.Int) (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.GetTotalValidatorShares(&_ChainRegistrarOnMainchain.CallOpts, subchainID, dynasty)
}

// GetValidatorGuarantorsWithPendingWithdrawals is a free data retrieval call binding the contract method 0xe6eaaa81.
//
// Solidity: function getValidatorGuarantorsWithPendingWithdrawals(uint256 subchainID) view returns(address[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetValidatorGuarantorsWithPendingWithdrawals(opts *bind.CallOpts, subchainID *big.Int) ([]common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getValidatorGuarantorsWithPendingWithdrawals", subchainID)

	if err != nil {
		return *new([]common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address)

	return out0, err

}

// GetValidatorGuarantorsWithPendingWithdrawals is a free data retrieval call binding the contract method 0xe6eaaa81.
//
// Solidity: function getValidatorGuarantorsWithPendingWithdrawals(uint256 subchainID) view returns(address[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetValidatorGuarantorsWithPendingWithdrawals(subchainID *big.Int) ([]common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.GetValidatorGuarantorsWithPendingWithdrawals(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetValidatorGuarantorsWithPendingWithdrawals is a free data retrieval call binding the contract method 0xe6eaaa81.
//
// Solidity: function getValidatorGuarantorsWithPendingWithdrawals(uint256 subchainID) view returns(address[])
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetValidatorGuarantorsWithPendingWithdrawals(subchainID *big.Int) ([]common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.GetValidatorGuarantorsWithPendingWithdrawals(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// GetValidatorSet is a free data retrieval call binding the contract method 0x43f27e45.
//
// Solidity: function getValidatorSet(uint256 subchainID, uint256 dynasty) view returns(address[] validators, uint256[] shareAmounts)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetValidatorSet(opts *bind.CallOpts, subchainID *big.Int, dynasty *big.Int) (struct {
	Validators   []common.Address
	ShareAmounts []*big.Int
}, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getValidatorSet", subchainID, dynasty)

	outstruct := new(struct {
		Validators   []common.Address
		ShareAmounts []*big.Int
	})
	if err != nil {
		return *outstruct, err
	}

	outstruct.Validators = *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address)
	outstruct.ShareAmounts = *abi.ConvertType(out[1], new([]*big.Int)).(*[]*big.Int)

	return *outstruct, err

}

// GetValidatorSet is a free data retrieval call binding the contract method 0x43f27e45.
//
// Solidity: function getValidatorSet(uint256 subchainID, uint256 dynasty) view returns(address[] validators, uint256[] shareAmounts)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetValidatorSet(subchainID *big.Int, dynasty *big.Int) (struct {
	Validators   []common.Address
	ShareAmounts []*big.Int
}, error) {
	return _ChainRegistrarOnMainchain.Contract.GetValidatorSet(&_ChainRegistrarOnMainchain.CallOpts, subchainID, dynasty)
}

// GetValidatorSet is a free data retrieval call binding the contract method 0x43f27e45.
//
// Solidity: function getValidatorSet(uint256 subchainID, uint256 dynasty) view returns(address[] validators, uint256[] shareAmounts)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetValidatorSet(subchainID *big.Int, dynasty *big.Int) (struct {
	Validators   []common.Address
	ShareAmounts []*big.Int
}, error) {
	return _ChainRegistrarOnMainchain.Contract.GetValidatorSet(&_ChainRegistrarOnMainchain.CallOpts, subchainID, dynasty)
}

// GetValidatorShares is a free data retrieval call binding the contract method 0x3f216374.
//
// Solidity: function getValidatorShares(uint256 subchainID, uint256 blockHeight, address validator) view returns(bool isAValidator, uint256 shareAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) GetValidatorShares(opts *bind.CallOpts, subchainID *big.Int, blockHeight *big.Int, validator common.Address) (struct {
	IsAValidator bool
	ShareAmount  *big.Int
}, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "getValidatorShares", subchainID, blockHeight, validator)

	outstruct := new(struct {
		IsAValidator bool
		ShareAmount  *big.Int
	})
	if err != nil {
		return *outstruct, err
	}

	outstruct.IsAValidator = *abi.ConvertType(out[0], new(bool)).(*bool)
	outstruct.ShareAmount = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)

	return *outstruct, err

}

// GetValidatorShares is a free data retrieval call binding the contract method 0x3f216374.
//
// Solidity: function getValidatorShares(uint256 subchainID, uint256 blockHeight, address validator) view returns(bool isAValidator, uint256 shareAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) GetValidatorShares(subchainID *big.Int, blockHeight *big.Int, validator common.Address) (struct {
	IsAValidator bool
	ShareAmount  *big.Int
}, error) {
	return _ChainRegistrarOnMainchain.Contract.GetValidatorShares(&_ChainRegistrarOnMainchain.CallOpts, subchainID, blockHeight, validator)
}

// GetValidatorShares is a free data retrieval call binding the contract method 0x3f216374.
//
// Solidity: function getValidatorShares(uint256 subchainID, uint256 blockHeight, address validator) view returns(bool isAValidator, uint256 shareAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) GetValidatorShares(subchainID *big.Int, blockHeight *big.Int, validator common.Address) (struct {
	IsAValidator bool
	ShareAmount  *big.Int
}, error) {
	return _ChainRegistrarOnMainchain.Contract.GetValidatorShares(&_ChainRegistrarOnMainchain.CallOpts, subchainID, blockHeight, validator)
}

// Governor is a free data retrieval call binding the contract method 0x0c340a24.
//
// Solidity: function governor() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) Governor(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "governor")

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// Governor is a free data retrieval call binding the contract method 0x0c340a24.
//
// Solidity: function governor() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) Governor() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.Governor(&_ChainRegistrarOnMainchain.CallOpts)
}

// Governor is a free data retrieval call binding the contract method 0x0c340a24.
//
// Solidity: function governor() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) Governor() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.Governor(&_ChainRegistrarOnMainchain.CallOpts)
}

// InitialFeeRequired is a free data retrieval call binding the contract method 0x2e31ac1e.
//
// Solidity: function initialFeeRequired() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) InitialFeeRequired(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "initialFeeRequired")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// InitialFeeRequired is a free data retrieval call binding the contract method 0x2e31ac1e.
//
// Solidity: function initialFeeRequired() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) InitialFeeRequired() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.InitialFeeRequired(&_ChainRegistrarOnMainchain.CallOpts)
}

// InitialFeeRequired is a free data retrieval call binding the contract method 0x2e31ac1e.
//
// Solidity: function initialFeeRequired() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) InitialFeeRequired() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.InitialFeeRequired(&_ChainRegistrarOnMainchain.CallOpts)
}

// IsARegisteredSubchain is a free data retrieval call binding the contract method 0x43b71f05.
//
// Solidity: function isARegisteredSubchain(uint256 subchainID) view returns(bool)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) IsARegisteredSubchain(opts *bind.CallOpts, subchainID *big.Int) (bool, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "isARegisteredSubchain", subchainID)

	if err != nil {
		return *new(bool), err
	}

	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)

	return out0, err

}

// IsARegisteredSubchain is a free data retrieval call binding the contract method 0x43b71f05.
//
// Solidity: function isARegisteredSubchain(uint256 subchainID) view returns(bool)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) IsARegisteredSubchain(subchainID *big.Int) (bool, error) {
	return _ChainRegistrarOnMainchain.Contract.IsARegisteredSubchain(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// IsARegisteredSubchain is a free data retrieval call binding the contract method 0x43b71f05.
//
// Solidity: function isARegisteredSubchain(uint256 subchainID) view returns(bool)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) IsARegisteredSubchain(subchainID *big.Int) (bool, error) {
	return _ChainRegistrarOnMainchain.Contract.IsARegisteredSubchain(&_ChainRegistrarOnMainchain.CallOpts, subchainID)
}

// MinChainCollateralAmount is a free data retrieval call binding the contract method 0xeae243f8.
//
// Solidity: function minChainCollateralAmount() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) MinChainCollateralAmount(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "minChainCollateralAmount")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// MinChainCollateralAmount is a free data retrieval call binding the contract method 0xeae243f8.
//
// Solidity: function minChainCollateralAmount() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) MinChainCollateralAmount() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.MinChainCollateralAmount(&_ChainRegistrarOnMainchain.CallOpts)
}

// MinChainCollateralAmount is a free data retrieval call binding the contract method 0xeae243f8.
//
// Solidity: function minChainCollateralAmount() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) MinChainCollateralAmount() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.MinChainCollateralAmount(&_ChainRegistrarOnMainchain.CallOpts)
}

// MinSubchainID is a free data retrieval call binding the contract method 0xacca1088.
//
// Solidity: function minSubchainID() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) MinSubchainID(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "minSubchainID")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// MinSubchainID is a free data retrieval call binding the contract method 0xacca1088.
//
// Solidity: function minSubchainID() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) MinSubchainID() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.MinSubchainID(&_ChainRegistrarOnMainchain.CallOpts)
}

// MinSubchainID is a free data retrieval call binding the contract method 0xacca1088.
//
// Solidity: function minSubchainID() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) MinSubchainID() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.MinSubchainID(&_ChainRegistrarOnMainchain.CallOpts)
}

// NumBlocksPerDynasty is a free data retrieval call binding the contract method 0x67016090.
//
// Solidity: function numBlocksPerDynasty() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) NumBlocksPerDynasty(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "numBlocksPerDynasty")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// NumBlocksPerDynasty is a free data retrieval call binding the contract method 0x67016090.
//
// Solidity: function numBlocksPerDynasty() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) NumBlocksPerDynasty() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.NumBlocksPerDynasty(&_ChainRegistrarOnMainchain.CallOpts)
}

// NumBlocksPerDynasty is a free data retrieval call binding the contract method 0x67016090.
//
// Solidity: function numBlocksPerDynasty() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) NumBlocksPerDynasty() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.NumBlocksPerDynasty(&_ChainRegistrarOnMainchain.CallOpts)
}

// SubchainCollateralReturnPercentage is a free data retrieval call binding the contract method 0x0cc94f59.
//
// Solidity: function subchainCollateralReturnPercentage() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) SubchainCollateralReturnPercentage(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "subchainCollateralReturnPercentage")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// SubchainCollateralReturnPercentage is a free data retrieval call binding the contract method 0x0cc94f59.
//
// Solidity: function subchainCollateralReturnPercentage() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) SubchainCollateralReturnPercentage() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.SubchainCollateralReturnPercentage(&_ChainRegistrarOnMainchain.CallOpts)
}

// SubchainCollateralReturnPercentage is a free data retrieval call binding the contract method 0x0cc94f59.
//
// Solidity: function subchainCollateralReturnPercentage() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) SubchainCollateralReturnPercentage() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.SubchainCollateralReturnPercentage(&_ChainRegistrarOnMainchain.CallOpts)
}

// SubchainIDs is a free data retrieval call binding the contract method 0xd77a6e66.
//
// Solidity: function subchainIDs(uint256 ) view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) SubchainIDs(opts *bind.CallOpts, arg0 *big.Int) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "subchainIDs", arg0)

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// SubchainIDs is a free data retrieval call binding the contract method 0xd77a6e66.
//
// Solidity: function subchainIDs(uint256 ) view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) SubchainIDs(arg0 *big.Int) (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.SubchainIDs(&_ChainRegistrarOnMainchain.CallOpts, arg0)
}

// SubchainIDs is a free data retrieval call binding the contract method 0xd77a6e66.
//
// Solidity: function subchainIDs(uint256 ) view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) SubchainIDs(arg0 *big.Int) (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.SubchainIDs(&_ChainRegistrarOnMainchain.CallOpts, arg0)
}

// SubchainMetadataMap is a free data retrieval call binding the contract method 0xec090302.
//
// Solidity: function subchainMetadataMap(uint256 ) view returns(address guarantor, uint256 collateralAmount, address governanceToken, string genesisHash, uint256 registrationHeight, bool exists)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) SubchainMetadataMap(opts *bind.CallOpts, arg0 *big.Int) (struct {
	Guarantor          common.Address
	CollateralAmount   *big.Int
	GovernanceToken    common.Address
	GenesisHash        string
	RegistrationHeight *big.Int
	Exists             bool
}, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "subchainMetadataMap", arg0)

	outstruct := new(struct {
		Guarantor          common.Address
		CollateralAmount   *big.Int
		GovernanceToken    common.Address
		GenesisHash        string
		RegistrationHeight *big.Int
		Exists             bool
	})
	if err != nil {
		return *outstruct, err
	}

	outstruct.Guarantor = *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
	outstruct.CollateralAmount = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)
	outstruct.GovernanceToken = *abi.ConvertType(out[2], new(common.Address)).(*common.Address)
	outstruct.GenesisHash = *abi.ConvertType(out[3], new(string)).(*string)
	outstruct.RegistrationHeight = *abi.ConvertType(out[4], new(*big.Int)).(**big.Int)
	outstruct.Exists = *abi.ConvertType(out[5], new(bool)).(*bool)

	return *outstruct, err

}

// SubchainMetadataMap is a free data retrieval call binding the contract method 0xec090302.
//
// Solidity: function subchainMetadataMap(uint256 ) view returns(address guarantor, uint256 collateralAmount, address governanceToken, string genesisHash, uint256 registrationHeight, bool exists)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) SubchainMetadataMap(arg0 *big.Int) (struct {
	Guarantor          common.Address
	CollateralAmount   *big.Int
	GovernanceToken    common.Address
	GenesisHash        string
	RegistrationHeight *big.Int
	Exists             bool
}, error) {
	return _ChainRegistrarOnMainchain.Contract.SubchainMetadataMap(&_ChainRegistrarOnMainchain.CallOpts, arg0)
}

// SubchainMetadataMap is a free data retrieval call binding the contract method 0xec090302.
//
// Solidity: function subchainMetadataMap(uint256 ) view returns(address guarantor, uint256 collateralAmount, address governanceToken, string genesisHash, uint256 registrationHeight, bool exists)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) SubchainMetadataMap(arg0 *big.Int) (struct {
	Guarantor          common.Address
	CollateralAmount   *big.Int
	GovernanceToken    common.Address
	GenesisHash        string
	RegistrationHeight *big.Int
	Exists             bool
}, error) {
	return _ChainRegistrarOnMainchain.Contract.SubchainMetadataMap(&_ChainRegistrarOnMainchain.CallOpts, arg0)
}

// SuperAdmin is a free data retrieval call binding the contract method 0x29575f6a.
//
// Solidity: function superAdmin() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) SuperAdmin(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "superAdmin")

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// SuperAdmin is a free data retrieval call binding the contract method 0x29575f6a.
//
// Solidity: function superAdmin() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) SuperAdmin() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.SuperAdmin(&_ChainRegistrarOnMainchain.CallOpts)
}

// SuperAdmin is a free data retrieval call binding the contract method 0x29575f6a.
//
// Solidity: function superAdmin() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) SuperAdmin() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.SuperAdmin(&_ChainRegistrarOnMainchain.CallOpts)
}

// Vcm is a free data retrieval call binding the contract method 0xdc1e8263.
//
// Solidity: function vcm() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) Vcm(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "vcm")

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// Vcm is a free data retrieval call binding the contract method 0xdc1e8263.
//
// Solidity: function vcm() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) Vcm() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.Vcm(&_ChainRegistrarOnMainchain.CallOpts)
}

// Vcm is a free data retrieval call binding the contract method 0xdc1e8263.
//
// Solidity: function vcm() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) Vcm() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.Vcm(&_ChainRegistrarOnMainchain.CallOpts)
}

// Vsm is a free data retrieval call binding the contract method 0x07ddf6bc.
//
// Solidity: function vsm() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) Vsm(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "vsm")

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// Vsm is a free data retrieval call binding the contract method 0x07ddf6bc.
//
// Solidity: function vsm() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) Vsm() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.Vsm(&_ChainRegistrarOnMainchain.CallOpts)
}

// Vsm is a free data retrieval call binding the contract method 0x07ddf6bc.
//
// Solidity: function vsm() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) Vsm() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.Vsm(&_ChainRegistrarOnMainchain.CallOpts)
}

// WTheta is a free data retrieval call binding the contract method 0xfc80ade3.
//
// Solidity: function wTheta() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) WTheta(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "wTheta")

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// WTheta is a free data retrieval call binding the contract method 0xfc80ade3.
//
// Solidity: function wTheta() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) WTheta() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.WTheta(&_ChainRegistrarOnMainchain.CallOpts)
}

// WTheta is a free data retrieval call binding the contract method 0xfc80ade3.
//
// Solidity: function wTheta() view returns(address)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) WTheta() (common.Address, error) {
	return _ChainRegistrarOnMainchain.Contract.WTheta(&_ChainRegistrarOnMainchain.CallOpts)
}

// WithdrawalPendingPeriodInBlocks is a free data retrieval call binding the contract method 0x336c7308.
//
// Solidity: function withdrawalPendingPeriodInBlocks() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCaller) WithdrawalPendingPeriodInBlocks(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _ChainRegistrarOnMainchain.contract.Call(opts, &out, "withdrawalPendingPeriodInBlocks")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// WithdrawalPendingPeriodInBlocks is a free data retrieval call binding the contract method 0x336c7308.
//
// Solidity: function withdrawalPendingPeriodInBlocks() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) WithdrawalPendingPeriodInBlocks() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.WithdrawalPendingPeriodInBlocks(&_ChainRegistrarOnMainchain.CallOpts)
}

// WithdrawalPendingPeriodInBlocks is a free data retrieval call binding the contract method 0x336c7308.
//
// Solidity: function withdrawalPendingPeriodInBlocks() view returns(uint256)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainCallerSession) WithdrawalPendingPeriodInBlocks() (*big.Int, error) {
	return _ChainRegistrarOnMainchain.Contract.WithdrawalPendingPeriodInBlocks(&_ChainRegistrarOnMainchain.CallOpts)
}

// AddSubchainCollateral is a paid mutator transaction binding the contract method 0x1911ee41.
//
// Solidity: function addSubchainCollateral(uint256 subchainID, uint256 additionalCollateral) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) AddSubchainCollateral(opts *bind.TransactOpts, subchainID *big.Int, additionalCollateral *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "addSubchainCollateral", subchainID, additionalCollateral)
}

// AddSubchainCollateral is a paid mutator transaction binding the contract method 0x1911ee41.
//
// Solidity: function addSubchainCollateral(uint256 subchainID, uint256 additionalCollateral) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) AddSubchainCollateral(subchainID *big.Int, additionalCollateral *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.AddSubchainCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, additionalCollateral)
}

// AddSubchainCollateral is a paid mutator transaction binding the contract method 0x1911ee41.
//
// Solidity: function addSubchainCollateral(uint256 subchainID, uint256 additionalCollateral) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) AddSubchainCollateral(subchainID *big.Int, additionalCollateral *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.AddSubchainCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, additionalCollateral)
}

// ClaimCollateral is a paid mutator transaction binding the contract method 0xc49785b4.
//
// Solidity: function claimCollateral(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) ClaimCollateral(opts *bind.TransactOpts, subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "claimCollateral", subchainID)
}

// ClaimCollateral is a paid mutator transaction binding the contract method 0xc49785b4.
//
// Solidity: function claimCollateral(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) ClaimCollateral(subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.ClaimCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID)
}

// ClaimCollateral is a paid mutator transaction binding the contract method 0xc49785b4.
//
// Solidity: function claimCollateral(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) ClaimCollateral(subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.ClaimCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID)
}

// ClaimStake is a paid mutator transaction binding the contract method 0x44c7d6ef.
//
// Solidity: function claimStake(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) ClaimStake(opts *bind.TransactOpts, subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "claimStake", subchainID)
}

// ClaimStake is a paid mutator transaction binding the contract method 0x44c7d6ef.
//
// Solidity: function claimStake(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) ClaimStake(subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.ClaimStake(&_ChainRegistrarOnMainchain.TransactOpts, subchainID)
}

// ClaimStake is a paid mutator transaction binding the contract method 0x44c7d6ef.
//
// Solidity: function claimStake(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) ClaimStake(subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.ClaimStake(&_ChainRegistrarOnMainchain.TransactOpts, subchainID)
}

// DepositCollateral is a paid mutator transaction binding the contract method 0xebea51b4.
//
// Solidity: function depositCollateral(uint256 subchainID, address validatorCandidate, uint256 collateralAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) DepositCollateral(opts *bind.TransactOpts, subchainID *big.Int, validatorCandidate common.Address, collateralAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "depositCollateral", subchainID, validatorCandidate, collateralAmount)
}

// DepositCollateral is a paid mutator transaction binding the contract method 0xebea51b4.
//
// Solidity: function depositCollateral(uint256 subchainID, address validatorCandidate, uint256 collateralAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) DepositCollateral(subchainID *big.Int, validatorCandidate common.Address, collateralAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.DepositCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validatorCandidate, collateralAmount)
}

// DepositCollateral is a paid mutator transaction binding the contract method 0xebea51b4.
//
// Solidity: function depositCollateral(uint256 subchainID, address validatorCandidate, uint256 collateralAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) DepositCollateral(subchainID *big.Int, validatorCandidate common.Address, collateralAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.DepositCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validatorCandidate, collateralAmount)
}

// DepositStake is a paid mutator transaction binding the contract method 0xaace2957.
//
// Solidity: function depositStake(uint256 subchainID, address validator, uint256 govTokenAmount) payable returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) DepositStake(opts *bind.TransactOpts, subchainID *big.Int, validator common.Address, govTokenAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "depositStake", subchainID, validator, govTokenAmount)
}

// DepositStake is a paid mutator transaction binding the contract method 0xaace2957.
//
// Solidity: function depositStake(uint256 subchainID, address validator, uint256 govTokenAmount) payable returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) DepositStake(subchainID *big.Int, validator common.Address, govTokenAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.DepositStake(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validator, govTokenAmount)
}

// DepositStake is a paid mutator transaction binding the contract method 0xaace2957.
//
// Solidity: function depositStake(uint256 subchainID, address validator, uint256 govTokenAmount) payable returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) DepositStake(subchainID *big.Int, validator common.Address, govTokenAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.DepositStake(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validator, govTokenAmount)
}

// DeregisterSubchain is a paid mutator transaction binding the contract method 0xe6e5e0aa.
//
// Solidity: function deregisterSubchain(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) DeregisterSubchain(opts *bind.TransactOpts, subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "deregisterSubchain", subchainID)
}

// DeregisterSubchain is a paid mutator transaction binding the contract method 0xe6e5e0aa.
//
// Solidity: function deregisterSubchain(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) DeregisterSubchain(subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.DeregisterSubchain(&_ChainRegistrarOnMainchain.TransactOpts, subchainID)
}

// DeregisterSubchain is a paid mutator transaction binding the contract method 0xe6e5e0aa.
//
// Solidity: function deregisterSubchain(uint256 subchainID) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) DeregisterSubchain(subchainID *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.DeregisterSubchain(&_ChainRegistrarOnMainchain.TransactOpts, subchainID)
}

// RegisterSubchain is a paid mutator transaction binding the contract method 0xc74fba44.
//
// Solidity: function registerSubchain(uint256 subchainID, address governanceToken, uint256 collateralAmount, string genesisHash) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) RegisterSubchain(opts *bind.TransactOpts, subchainID *big.Int, governanceToken common.Address, collateralAmount *big.Int, genesisHash string) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "registerSubchain", subchainID, governanceToken, collateralAmount, genesisHash)
}

// RegisterSubchain is a paid mutator transaction binding the contract method 0xc74fba44.
//
// Solidity: function registerSubchain(uint256 subchainID, address governanceToken, uint256 collateralAmount, string genesisHash) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) RegisterSubchain(subchainID *big.Int, governanceToken common.Address, collateralAmount *big.Int, genesisHash string) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.RegisterSubchain(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, governanceToken, collateralAmount, genesisHash)
}

// RegisterSubchain is a paid mutator transaction binding the contract method 0xc74fba44.
//
// Solidity: function registerSubchain(uint256 subchainID, address governanceToken, uint256 collateralAmount, string genesisHash) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) RegisterSubchain(subchainID *big.Int, governanceToken common.Address, collateralAmount *big.Int, genesisHash string) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.RegisterSubchain(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, governanceToken, collateralAmount, genesisHash)
}

// SlashChainCollateral is a paid mutator transaction binding the contract method 0xecda8779.
//
// Solidity: function slashChainCollateral(uint256 subchainID, uint256 slashAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) SlashChainCollateral(opts *bind.TransactOpts, subchainID *big.Int, slashAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "slashChainCollateral", subchainID, slashAmount)
}

// SlashChainCollateral is a paid mutator transaction binding the contract method 0xecda8779.
//
// Solidity: function slashChainCollateral(uint256 subchainID, uint256 slashAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) SlashChainCollateral(subchainID *big.Int, slashAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.SlashChainCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, slashAmount)
}

// SlashChainCollateral is a paid mutator transaction binding the contract method 0xecda8779.
//
// Solidity: function slashChainCollateral(uint256 subchainID, uint256 slashAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) SlashChainCollateral(subchainID *big.Int, slashAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.SlashChainCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, slashAmount)
}

// SlashValidatorCollateral is a paid mutator transaction binding the contract method 0xda078386.
//
// Solidity: function slashValidatorCollateral(uint256 subchainID, address validator, address guarantor, uint256 slashAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) SlashValidatorCollateral(opts *bind.TransactOpts, subchainID *big.Int, validator common.Address, guarantor common.Address, slashAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "slashValidatorCollateral", subchainID, validator, guarantor, slashAmount)
}

// SlashValidatorCollateral is a paid mutator transaction binding the contract method 0xda078386.
//
// Solidity: function slashValidatorCollateral(uint256 subchainID, address validator, address guarantor, uint256 slashAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) SlashValidatorCollateral(subchainID *big.Int, validator common.Address, guarantor common.Address, slashAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.SlashValidatorCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validator, guarantor, slashAmount)
}

// SlashValidatorCollateral is a paid mutator transaction binding the contract method 0xda078386.
//
// Solidity: function slashValidatorCollateral(uint256 subchainID, address validator, address guarantor, uint256 slashAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) SlashValidatorCollateral(subchainID *big.Int, validator common.Address, guarantor common.Address, slashAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.SlashValidatorCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validator, guarantor, slashAmount)
}

// UpdateAdmin is a paid mutator transaction binding the contract method 0xe2f273bd.
//
// Solidity: function updateAdmin(address newAdmin) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateAdmin(opts *bind.TransactOpts, newAdmin common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateAdmin", newAdmin)
}

// UpdateAdmin is a paid mutator transaction binding the contract method 0xe2f273bd.
//
// Solidity: function updateAdmin(address newAdmin) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateAdmin(newAdmin common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateAdmin(&_ChainRegistrarOnMainchain.TransactOpts, newAdmin)
}

// UpdateAdmin is a paid mutator transaction binding the contract method 0xe2f273bd.
//
// Solidity: function updateAdmin(address newAdmin) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateAdmin(newAdmin common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateAdmin(&_ChainRegistrarOnMainchain.TransactOpts, newAdmin)
}

// UpdateCrossChainFee is a paid mutator transaction binding the contract method 0x9886ddbc.
//
// Solidity: function updateCrossChainFee(uint256 newCrossChainFee) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateCrossChainFee(opts *bind.TransactOpts, newCrossChainFee *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateCrossChainFee", newCrossChainFee)
}

// UpdateCrossChainFee is a paid mutator transaction binding the contract method 0x9886ddbc.
//
// Solidity: function updateCrossChainFee(uint256 newCrossChainFee) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateCrossChainFee(newCrossChainFee *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateCrossChainFee(&_ChainRegistrarOnMainchain.TransactOpts, newCrossChainFee)
}

// UpdateCrossChainFee is a paid mutator transaction binding the contract method 0x9886ddbc.
//
// Solidity: function updateCrossChainFee(uint256 newCrossChainFee) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateCrossChainFee(newCrossChainFee *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateCrossChainFee(&_ChainRegistrarOnMainchain.TransactOpts, newCrossChainFee)
}

// UpdateFallbackReceiver is a paid mutator transaction binding the contract method 0xb3f99975.
//
// Solidity: function updateFallbackReceiver(address newFallbackReceiver) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateFallbackReceiver(opts *bind.TransactOpts, newFallbackReceiver common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateFallbackReceiver", newFallbackReceiver)
}

// UpdateFallbackReceiver is a paid mutator transaction binding the contract method 0xb3f99975.
//
// Solidity: function updateFallbackReceiver(address newFallbackReceiver) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateFallbackReceiver(newFallbackReceiver common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateFallbackReceiver(&_ChainRegistrarOnMainchain.TransactOpts, newFallbackReceiver)
}

// UpdateFallbackReceiver is a paid mutator transaction binding the contract method 0xb3f99975.
//
// Solidity: function updateFallbackReceiver(address newFallbackReceiver) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateFallbackReceiver(newFallbackReceiver common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateFallbackReceiver(&_ChainRegistrarOnMainchain.TransactOpts, newFallbackReceiver)
}

// UpdateGovernor is a paid mutator transaction binding the contract method 0x62f384ad.
//
// Solidity: function updateGovernor(address newGovernor) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateGovernor(opts *bind.TransactOpts, newGovernor common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateGovernor", newGovernor)
}

// UpdateGovernor is a paid mutator transaction binding the contract method 0x62f384ad.
//
// Solidity: function updateGovernor(address newGovernor) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateGovernor(newGovernor common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateGovernor(&_ChainRegistrarOnMainchain.TransactOpts, newGovernor)
}

// UpdateGovernor is a paid mutator transaction binding the contract method 0x62f384ad.
//
// Solidity: function updateGovernor(address newGovernor) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateGovernor(newGovernor common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateGovernor(&_ChainRegistrarOnMainchain.TransactOpts, newGovernor)
}

// UpdateInitialFeeRequired is a paid mutator transaction binding the contract method 0xba22a7f4.
//
// Solidity: function updateInitialFeeRequired(uint256 newInitialFeeRequired) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateInitialFeeRequired(opts *bind.TransactOpts, newInitialFeeRequired *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateInitialFeeRequired", newInitialFeeRequired)
}

// UpdateInitialFeeRequired is a paid mutator transaction binding the contract method 0xba22a7f4.
//
// Solidity: function updateInitialFeeRequired(uint256 newInitialFeeRequired) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateInitialFeeRequired(newInitialFeeRequired *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateInitialFeeRequired(&_ChainRegistrarOnMainchain.TransactOpts, newInitialFeeRequired)
}

// UpdateInitialFeeRequired is a paid mutator transaction binding the contract method 0xba22a7f4.
//
// Solidity: function updateInitialFeeRequired(uint256 newInitialFeeRequired) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateInitialFeeRequired(newInitialFeeRequired *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateInitialFeeRequired(&_ChainRegistrarOnMainchain.TransactOpts, newInitialFeeRequired)
}

// UpdateMinChainCollateralAmount is a paid mutator transaction binding the contract method 0xcec9c6e1.
//
// Solidity: function updateMinChainCollateralAmount(uint256 amount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateMinChainCollateralAmount(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateMinChainCollateralAmount", amount)
}

// UpdateMinChainCollateralAmount is a paid mutator transaction binding the contract method 0xcec9c6e1.
//
// Solidity: function updateMinChainCollateralAmount(uint256 amount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateMinChainCollateralAmount(amount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateMinChainCollateralAmount(&_ChainRegistrarOnMainchain.TransactOpts, amount)
}

// UpdateMinChainCollateralAmount is a paid mutator transaction binding the contract method 0xcec9c6e1.
//
// Solidity: function updateMinChainCollateralAmount(uint256 amount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateMinChainCollateralAmount(amount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateMinChainCollateralAmount(&_ChainRegistrarOnMainchain.TransactOpts, amount)
}

// UpdateMinValidatorCollateralAmount is a paid mutator transaction binding the contract method 0x1ead7deb.
//
// Solidity: function updateMinValidatorCollateralAmount(uint256 amount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateMinValidatorCollateralAmount(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateMinValidatorCollateralAmount", amount)
}

// UpdateMinValidatorCollateralAmount is a paid mutator transaction binding the contract method 0x1ead7deb.
//
// Solidity: function updateMinValidatorCollateralAmount(uint256 amount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateMinValidatorCollateralAmount(amount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateMinValidatorCollateralAmount(&_ChainRegistrarOnMainchain.TransactOpts, amount)
}

// UpdateMinValidatorCollateralAmount is a paid mutator transaction binding the contract method 0x1ead7deb.
//
// Solidity: function updateMinValidatorCollateralAmount(uint256 amount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateMinValidatorCollateralAmount(amount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateMinValidatorCollateralAmount(&_ChainRegistrarOnMainchain.TransactOpts, amount)
}

// UpdateSubchainCollateralReturnPercentage is a paid mutator transaction binding the contract method 0x3cc41ef8.
//
// Solidity: function updateSubchainCollateralReturnPercentage(uint256 newPercentage) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateSubchainCollateralReturnPercentage(opts *bind.TransactOpts, newPercentage *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateSubchainCollateralReturnPercentage", newPercentage)
}

// UpdateSubchainCollateralReturnPercentage is a paid mutator transaction binding the contract method 0x3cc41ef8.
//
// Solidity: function updateSubchainCollateralReturnPercentage(uint256 newPercentage) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateSubchainCollateralReturnPercentage(newPercentage *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateSubchainCollateralReturnPercentage(&_ChainRegistrarOnMainchain.TransactOpts, newPercentage)
}

// UpdateSubchainCollateralReturnPercentage is a paid mutator transaction binding the contract method 0x3cc41ef8.
//
// Solidity: function updateSubchainCollateralReturnPercentage(uint256 newPercentage) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateSubchainCollateralReturnPercentage(newPercentage *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateSubchainCollateralReturnPercentage(&_ChainRegistrarOnMainchain.TransactOpts, newPercentage)
}

// UpdateSuperAdmin is a paid mutator transaction binding the contract method 0xcae43fd8.
//
// Solidity: function updateSuperAdmin(address newSuperAdmin) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateSuperAdmin(opts *bind.TransactOpts, newSuperAdmin common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateSuperAdmin", newSuperAdmin)
}

// UpdateSuperAdmin is a paid mutator transaction binding the contract method 0xcae43fd8.
//
// Solidity: function updateSuperAdmin(address newSuperAdmin) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateSuperAdmin(newSuperAdmin common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateSuperAdmin(&_ChainRegistrarOnMainchain.TransactOpts, newSuperAdmin)
}

// UpdateSuperAdmin is a paid mutator transaction binding the contract method 0xcae43fd8.
//
// Solidity: function updateSuperAdmin(address newSuperAdmin) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateSuperAdmin(newSuperAdmin common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateSuperAdmin(&_ChainRegistrarOnMainchain.TransactOpts, newSuperAdmin)
}

// UpdateVCMOwner is a paid mutator transaction binding the contract method 0xa74c83b7.
//
// Solidity: function updateVCMOwner(address newOwner) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateVCMOwner(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateVCMOwner", newOwner)
}

// UpdateVCMOwner is a paid mutator transaction binding the contract method 0xa74c83b7.
//
// Solidity: function updateVCMOwner(address newOwner) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateVCMOwner(newOwner common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateVCMOwner(&_ChainRegistrarOnMainchain.TransactOpts, newOwner)
}

// UpdateVCMOwner is a paid mutator transaction binding the contract method 0xa74c83b7.
//
// Solidity: function updateVCMOwner(address newOwner) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateVCMOwner(newOwner common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateVCMOwner(&_ChainRegistrarOnMainchain.TransactOpts, newOwner)
}

// UpdateVSMOwner is a paid mutator transaction binding the contract method 0xc21d72bf.
//
// Solidity: function updateVSMOwner(address newOwner) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) UpdateVSMOwner(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "updateVSMOwner", newOwner)
}

// UpdateVSMOwner is a paid mutator transaction binding the contract method 0xc21d72bf.
//
// Solidity: function updateVSMOwner(address newOwner) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) UpdateVSMOwner(newOwner common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateVSMOwner(&_ChainRegistrarOnMainchain.TransactOpts, newOwner)
}

// UpdateVSMOwner is a paid mutator transaction binding the contract method 0xc21d72bf.
//
// Solidity: function updateVSMOwner(address newOwner) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) UpdateVSMOwner(newOwner common.Address) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.UpdateVSMOwner(&_ChainRegistrarOnMainchain.TransactOpts, newOwner)
}

// WithdrawCollateral is a paid mutator transaction binding the contract method 0x99ea56b0.
//
// Solidity: function withdrawCollateral(uint256 subchainID, address validatorCandidate, uint256 collateralAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) WithdrawCollateral(opts *bind.TransactOpts, subchainID *big.Int, validatorCandidate common.Address, collateralAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "withdrawCollateral", subchainID, validatorCandidate, collateralAmount)
}

// WithdrawCollateral is a paid mutator transaction binding the contract method 0x99ea56b0.
//
// Solidity: function withdrawCollateral(uint256 subchainID, address validatorCandidate, uint256 collateralAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) WithdrawCollateral(subchainID *big.Int, validatorCandidate common.Address, collateralAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.WithdrawCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validatorCandidate, collateralAmount)
}

// WithdrawCollateral is a paid mutator transaction binding the contract method 0x99ea56b0.
//
// Solidity: function withdrawCollateral(uint256 subchainID, address validatorCandidate, uint256 collateralAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) WithdrawCollateral(subchainID *big.Int, validatorCandidate common.Address, collateralAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.WithdrawCollateral(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validatorCandidate, collateralAmount)
}

// WithdrawStake is a paid mutator transaction binding the contract method 0x9f9106cf.
//
// Solidity: function withdrawStake(uint256 subchainID, address validator, uint256 shareAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactor) WithdrawStake(opts *bind.TransactOpts, subchainID *big.Int, validator common.Address, shareAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.contract.Transact(opts, "withdrawStake", subchainID, validator, shareAmount)
}

// WithdrawStake is a paid mutator transaction binding the contract method 0x9f9106cf.
//
// Solidity: function withdrawStake(uint256 subchainID, address validator, uint256 shareAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainSession) WithdrawStake(subchainID *big.Int, validator common.Address, shareAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.WithdrawStake(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validator, shareAmount)
}

// WithdrawStake is a paid mutator transaction binding the contract method 0x9f9106cf.
//
// Solidity: function withdrawStake(uint256 subchainID, address validator, uint256 shareAmount) returns()
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainTransactorSession) WithdrawStake(subchainID *big.Int, validator common.Address, shareAmount *big.Int) (*types.Transaction, error) {
	return _ChainRegistrarOnMainchain.Contract.WithdrawStake(&_ChainRegistrarOnMainchain.TransactOpts, subchainID, validator, shareAmount)
}

// ChainRegistrarOnMainchainSlashChainCollateralIterator is returned from FilterSlashChainCollateral and is used to iterate over the raw logs and unpacked data for SlashChainCollateral events raised by the ChainRegistrarOnMainchain contract.
type ChainRegistrarOnMainchainSlashChainCollateralIterator struct {
	Event *ChainRegistrarOnMainchainSlashChainCollateral // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *ChainRegistrarOnMainchainSlashChainCollateralIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(ChainRegistrarOnMainchainSlashChainCollateral)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(ChainRegistrarOnMainchainSlashChainCollateral)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *ChainRegistrarOnMainchainSlashChainCollateralIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *ChainRegistrarOnMainchainSlashChainCollateralIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// ChainRegistrarOnMainchainSlashChainCollateral represents a SlashChainCollateral event raised by the ChainRegistrarOnMainchain contract.
type ChainRegistrarOnMainchainSlashChainCollateral struct {
	SubchainID  *big.Int
	SlashAmount *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}

// FilterSlashChainCollateral is a free log retrieval operation binding the contract event 0x75396b0e74e738b367e9c25e4168aa3b5e00d2ef5650b014c45a338ebedc5834.
//
// Solidity: event SlashChainCollateral(uint256 subchainID, uint256 slashAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainFilterer) FilterSlashChainCollateral(opts *bind.FilterOpts) (*ChainRegistrarOnMainchainSlashChainCollateralIterator, error) {

	logs, sub, err := _ChainRegistrarOnMainchain.contract.FilterLogs(opts, "SlashChainCollateral")
	if err != nil {
		return nil, err
	}
	return &ChainRegistrarOnMainchainSlashChainCollateralIterator{contract: _ChainRegistrarOnMainchain.contract, event: "SlashChainCollateral", logs: logs, sub: sub}, nil
}

// WatchSlashChainCollateral is a free log subscription operation binding the contract event 0x75396b0e74e738b367e9c25e4168aa3b5e00d2ef5650b014c45a338ebedc5834.
//
// Solidity: event SlashChainCollateral(uint256 subchainID, uint256 slashAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainFilterer) WatchSlashChainCollateral(opts *bind.WatchOpts, sink chan<- *ChainRegistrarOnMainchainSlashChainCollateral) (event.Subscription, error) {

	logs, sub, err := _ChainRegistrarOnMainchain.contract.WatchLogs(opts, "SlashChainCollateral")
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(ChainRegistrarOnMainchainSlashChainCollateral)
				if err := _ChainRegistrarOnMainchain.contract.UnpackLog(event, "SlashChainCollateral", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// ParseSlashChainCollateral is a log parse operation binding the contract event 0x75396b0e74e738b367e9c25e4168aa3b5e00d2ef5650b014c45a338ebedc5834.
//
// Solidity: event SlashChainCollateral(uint256 subchainID, uint256 slashAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainFilterer) ParseSlashChainCollateral(log types.Log) (*ChainRegistrarOnMainchainSlashChainCollateral, error) {
	event := new(ChainRegistrarOnMainchainSlashChainCollateral)
	if err := _ChainRegistrarOnMainchain.contract.UnpackLog(event, "SlashChainCollateral", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}

// ChainRegistrarOnMainchainSlashValidatorCollateralIterator is returned from FilterSlashValidatorCollateral and is used to iterate over the raw logs and unpacked data for SlashValidatorCollateral events raised by the ChainRegistrarOnMainchain contract.
type ChainRegistrarOnMainchainSlashValidatorCollateralIterator struct {
	Event *ChainRegistrarOnMainchainSlashValidatorCollateral // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *ChainRegistrarOnMainchainSlashValidatorCollateralIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(ChainRegistrarOnMainchainSlashValidatorCollateral)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(ChainRegistrarOnMainchainSlashValidatorCollateral)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *ChainRegistrarOnMainchainSlashValidatorCollateralIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *ChainRegistrarOnMainchainSlashValidatorCollateralIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// ChainRegistrarOnMainchainSlashValidatorCollateral represents a SlashValidatorCollateral event raised by the ChainRegistrarOnMainchain contract.
type ChainRegistrarOnMainchainSlashValidatorCollateral struct {
	SubchainID          *big.Int
	Validator           common.Address
	Guarantor           common.Address
	ActualSlashedAmount *big.Int
	Raw                 types.Log // Blockchain specific contextual infos
}

// FilterSlashValidatorCollateral is a free log retrieval operation binding the contract event 0x1099c09baaa6f6984b5ecea47e7a86fb0084d23b7e13a9a453629f6a3e93c62e.
//
// Solidity: event SlashValidatorCollateral(uint256 subchainID, address validator, address guarantor, uint256 actualSlashedAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainFilterer) FilterSlashValidatorCollateral(opts *bind.FilterOpts) (*ChainRegistrarOnMainchainSlashValidatorCollateralIterator, error) {

	logs, sub, err := _ChainRegistrarOnMainchain.contract.FilterLogs(opts, "SlashValidatorCollateral")
	if err != nil {
		return nil, err
	}
	return &ChainRegistrarOnMainchainSlashValidatorCollateralIterator{contract: _ChainRegistrarOnMainchain.contract, event: "SlashValidatorCollateral", logs: logs, sub: sub}, nil
}

// WatchSlashValidatorCollateral is a free log subscription operation binding the contract event 0x1099c09baaa6f6984b5ecea47e7a86fb0084d23b7e13a9a453629f6a3e93c62e.
//
// Solidity: event SlashValidatorCollateral(uint256 subchainID, address validator, address guarantor, uint256 actualSlashedAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainFilterer) WatchSlashValidatorCollateral(opts *bind.WatchOpts, sink chan<- *ChainRegistrarOnMainchainSlashValidatorCollateral) (event.Subscription, error) {

	logs, sub, err := _ChainRegistrarOnMainchain.contract.WatchLogs(opts, "SlashValidatorCollateral")
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(ChainRegistrarOnMainchainSlashValidatorCollateral)
				if err := _ChainRegistrarOnMainchain.contract.UnpackLog(event, "SlashValidatorCollateral", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// ParseSlashValidatorCollateral is a log parse operation binding the contract event 0x1099c09baaa6f6984b5ecea47e7a86fb0084d23b7e13a9a453629f6a3e93c62e.
//
// Solidity: event SlashValidatorCollateral(uint256 subchainID, address validator, address guarantor, uint256 actualSlashedAmount)
func (_ChainRegistrarOnMainchain *ChainRegistrarOnMainchainFilterer) ParseSlashValidatorCollateral(log types.Log) (*ChainRegistrarOnMainchainSlashValidatorCollateral, error) {
	event := new(ChainRegistrarOnMainchainSlashValidatorCollateral)
	if err := _ChainRegistrarOnMainchain.contract.UnpackLog(event, "SlashValidatorCollateral", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}
